git agrega solo cambios modificados e ignora los archivos no rastreados

658

Ejecuté "git status" y a continuación se enumeran algunos archivos que fueron modificados / o bajo el encabezado "cambios no efectuados para commit". También enumeró algunos archivos sin seguimiento que quiero ignorar (tengo un archivo ".gitignore" en estos directorios).

Quiero poner los archivos modificados en etapas para poder confirmarlos. Cuando ejecuté "git add", agregó los archivos modificados Y los archivos que quiero ignorar a la puesta en escena.

¿Cómo agrego solo los archivos modificados e ignoro los archivos no rastreados si se presenta el estado de git a continuación?

Además, ¿mis archivos ".gitignore" funcionan correctamente?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")
Steve
fuente
1
si ha agregado el archivo .gitignore DESPUÉS de haber rastreado los archivos, el archivo .gitignore no ignorará los archivos que ya están siendo rastreados. eso podría ser un problema.
BKSpurgeon

Respuestas:

904

Idealmente, .gitignoredebe evitar que los archivos no rastreados (e ignorados) se muestren en estado, agregados usando git addetc. Así que le pediría que corrija su.gitignore

Puede hacerlo git add -upara organizar los archivos modificados y eliminados.

También puede hacer git commit -apara confirmar solo los archivos modificados y eliminados.

Tenga en cuenta que si tiene Git de versión anterior a 2.0 y se usa git add ., entonces deberá usarlo git add -u .(consulte " Diferencia de" git add -A"y git add ." ").

manojlds
fuente
74
punto de interés, this ( add -u) no agrega solo modified archivos, sino que también "agrega" deletedunos ... algo que actualmente estoy tratando de evitar.
Zach Lysobey
66
Para agregar solo archivos modificados, generalmente voy arriba del directorio superior de mi repositorio y escribo for fil in $(git diff --name-only --relative); do git add $fil; done. Si lo usara mucho (no lo hago), solo haría un alias para esto en mi ~/.bashrcarchivo. Esto, por supuesto, solo funciona en bash.
Krøllebølle
8
¿No hay una respuesta definitiva, solo respuestas de "funciona para la mayoría de la gente"? ¿Tengo que usar otro proceso para hacer esto correctamente? ¿Cómo es que esto no está integrado en git add? Parece algo tan común querer hacer.
Samuel
2
nb los métodos mencionados en estos comentarios fallarán si tiene nombres de archivo extraños (espacios, asteriscos, qué no). Para escapar correctamente de los archivos con nombres extraños, use:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile
3
git add -ues corto git add --updatey git commit -aes corto paragit commit --all
Hugo
96

Esto funcionó para mí:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

O mejor:

$ git ls-files --modified | xargs git add
user877329
fuente
No necesita agrupar (()) si no va a reutilizar el grupo, y me deja un espacio en blanco delante del nombre de archivo. No es que afecte el resultado final en este caso, pero en aras de poner un ejemplo, aquí está el comando sed que usé: sed 's /.* modified: * //'. Verificado en Mac OS X 10.9.5.
Samuel
@Samuel Grouping es bueno cuando se prueba la expresión. Luego puedo imprimir la coincidencia entre corchetes para ver si tengo razón.
user877329
1
@ Ярослав su solución agrega archivos modificados y sin seguimiento y es igual a git add -u, por lo que no responde la pregunta.
Nick Volynkin
77
--modified parece incluir eliminado y solo modificado
DMart
2
git diff-files -z --diff-filter = M --name-only | xargs -0 git add --dry-run parece funcionar bien.
DMart
10
git commit -a -m "message"

-a: Incluye todos los archivos actualmente modificados / eliminados en esta confirmación. Sin embargo, tenga en cuenta que los archivos no rastreados (nuevos) no están incluidos.

-m: establece el mensaje de confirmación

Saurabh
fuente
4

No dijiste cuál es actualmente tu .gitignore, pero un .gitignorecon los siguientes contenidos en tu directorio raíz debería ser el truco.

.metadata
build
Karl Bielefeldt
fuente
3
Estaba usando mi .gitignore todo mal. Tenía un archivo .gitignore vacío en cada directorio que quería ignorar en lugar de tener un solo gitignore con contenido.
Steve
1
@ Steve: Esto funcionaría si cada uno. gitognorecontenía un comienzo (ignorar todo). Pero una sola .gitignoreen el directorio superior suele ser mucho más simple de usar y suficiente.
maaartinus
2

Intenté probar esto para poder ver primero la lista de archivos:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

ejecutar:

chmod a+x file.sh
./file.sh 

Editar: (ver comentarios) Esto podría lograrse en un solo paso:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status
Mike Q
fuente
1
Esto podría lograrse en un solo paso:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom
Sí, debería haber proporcionado esa solución también, gracias, actualicé la publicación.
Mike Q
1

No estoy seguro si esta es una característica o un error, pero esto funcionó para nosotros:

git commit '' -m "Message"

Tenga en cuenta la lista de archivos vacía ''. Git interpreta esto para confirmar todos los archivos rastreados modificados, incluso si no están organizados, e ignora los archivos no rastreados.

Erik Englund
fuente
Esto definitivamente no funciona cuando se usa --amend.
GhostCat
1

Para organizar archivos modificados y eliminados

git add -u

Dayamoy
fuente