Git: lista solo archivos "no rastreados" (también, comandos personalizados)

339

¿Hay alguna forma de usar un comando como git ls-filespara mostrar solo archivos sin seguimiento?

La razón por la que pregunto es porque uso el siguiente comando para procesar todos los archivos eliminados:

git ls-files -d | xargs git rm

Me gustaría algo similar para los archivos sin seguimiento:

git some-command --some-options | xargs git add

Pude encontrar la -oopción git ls-files, pero esto no es lo que quiero porque también muestra archivos ignorados. También pude crear el siguiente comando largo y feo:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Parece que debe haber un mejor comando que pueda usar aquí. Y si no lo hay, ¿cómo creo comandos personalizados de git?

Todos somos monica
fuente
¿Podría explicar por qué lo necesita git ls-files -d | xargs git rm?
takeshin
Eso elimina todos los archivos que faltan avisos git. Mi pregunta era sobre cómo hacer una operación relacionada: agregar todos los archivos que git no está rastreando actualmente. Normalmente haría ambas cosas después de renombrar, combinar y / o dividir mis archivos de código.
Todos somos Mónica
Si faltan, ¿no están ya eliminados? A menos que ... salgas de otro lugar y luego intentes sincronizar con el control remoto ... Creo que lo entiendo.
Buttle Butkus
He probado todas las respuestas, si hay una carpeta vacía sin seguimiento, nadie puede encontrarla.
kittygirl
@kittygirl esto es correcto. Debido a que gitsolo funciona en archivos, no tiene ninguna forma de rastrear carpetas vacías. Intenta en su find . -type d -emptylugar.
Todos somos Mónica

Respuestas:

529

Para listar archivos sin seguimiento, intente:

git ls-files --others --exclude-standard

Si necesita canalizar la salida xargs, es aconsejable tener en cuenta los espacios en blanco usando git ls-files -zy xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Buen alias para agregar archivos sin seguimiento:

au = !git add $(git ls-files -o --exclude-standard)

Editar: Para referencia: git-ls-files

tomashin
fuente
77
¡Perfecto! ¿Qué !significa al comienzo de la línea de alias, o dónde está documentado?
Todos somos Mónica
@takeshin ¿Cómo obtener solo los nombres del directorio principal? No subcarpetas. Significa en estos archivos no rastreados: / P / a / files, / P / a / images, / P / a / / P /, ... - Solo quiero listar / P /
Dr.jacky
2
¿En qué situación necesitarías el alias? git add *hará lo mismo: agregar todos los archivos no rastreados, excepto el estándar (archivos cuyas rutas están cubiertas .gitignore).
toinetoine
1
Prefiero que mi alias funcione de manera coherente en todos los directorios en el repositorio (el comando ls-files solo muestra los archivos modificados en el árbol actual), así que tengo[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill
Gracias. Buen comentario.
Darth Egregious
71

Si solo desea eliminar archivos no rastreados, haga esto:

git clean -df

agregue xa eso si desea incluir también archivos ignorados específicamente. Yo uso git clean -dfxun montón durante todo el día.

Puede crear git personalizado simplemente escribiendo un script llamado git-whatevery tenerlo en su camino.

Dustin
fuente
Es mucho más común que quiera agregar todos los archivos sin seguimiento (por ejemplo, después de mover algunas cosas). En cualquier caso, gracias por el consejo sobre los comandos personalizados. ¿Dónde se documenta ese mecanismo?
Todos somos Mónica
55
Solo hazlo git add -Ao git add -u(dependiendo de lo que tenga más sentido para ti)
Dustin
1
Su comentario es la respuesta real, que también es repetida más tarde por @Mike Lococo
andho
2
y "git clean -dfxn" para una ejecución en seco agregando "n"
charo
50

git add -A -nHará lo que quieras. -Aagrega todos los archivos no rastreados al repositorio, lo -nconvierte en un lugar dry-rundonde no se realiza la adición, pero la salida de estado se muestra con una lista de cada archivo que se habría agregado.

Mike Lococo
fuente
77
¡Esta es una respuesta genial! Tenga en cuenta que excluye archivos en .gitignorearchivos, que generalmente es lo que queremos, pero si no git add -fAn,.
cdunn2001
1
Esta parece ser la mejor respuesta.
Rob Grant
1
Esta es la mejor respuesta. Explica explícitamente al usuario qué haría (sin hacerlo) y le da la oportunidad de revisarlo antes de agregarlo. Perfecto. ¡Gracias!
digitguy
También enumera los archivos modificados.
Frank-Rene Schäfer
agradable, pero lo entiendo envuelto: add '$file'. Mientras que git ls-files --exclude-standard -oda una salida desnuda, muy caliente.
hiperpallium
28

La respuesta aceptada se bloquea en los nombres de archivo con espacio. En este momento no estoy seguro de cómo actualizar el comando alias, así que pondré la versión mejorada aquí:

git ls-files -z -o --exclude-standard | xargs -0 git add
youurayy
fuente
Creo que esta es la respuesta correcta, porque proporciona la ruta de cada archivo para realizar una acción (como git add) en ellos después
Pablo Burgos
27

Todo es muy simple

Para obtener una lista de todos los archivos no rastreados, use el estado del comando git con la opción -u (--untracked-files)

git status -u
Valentyna
fuente
¿Qué tal una versión no recursiva de eso?
David
Desafortunadamente, también enumera los archivos ignorados a través de archivos .gitignore.
Plouff
8
Esta es la única respuesta que mostró mis archivos ignorados en la confirmación inicial, pero tuve que agregar --ignoredal git status -ucomando
DN
Esto es simple y agradable.
Eric Wang
1
Esto también muestra archivos modificados. Por lo tanto, no es una respuesta a la pregunta: solo muestra archivos sin seguimiento.
Comodín el
6

Al buscar archivos para agregar potencialmente. La salida de git showhace eso, pero también incluye muchas otras cosas. El siguiente comando es útil para obtener la misma lista de archivos pero sin todas las demás cosas.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Esto es útil cuando se combina en una tubería para encontrar archivos que coincidan con un patrón específico y luego canalizar eso git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add
cmac
fuente
6

Sé que es una pregunta antigua, pero en términos de enumerar archivos sin seguimiento, pensé que agregaría otro que también enumera las carpetas sin seguimiento:

Puede usar la operación git clean con -n (ejecución en seco) para mostrarle qué archivos eliminará (incluidos los archivos .gitignore):

git clean -xdn

Esto tiene la ventaja de mostrar todos los archivos y todas las carpetas que no se rastrean. Parámetros:

  • x - Muestra todos los archivos no rastreados (incluidos los ignorados por git y otros, como la salida de compilación, etc.)
  • d - mostrar directorios no rastreados
  • n¡Y lo más importante! - dryrun, es decir, en realidad no elimine nada, solo use el mecanismo de limpieza para mostrar los resultados.

Puede ser un poco inseguro hacerlo así en caso de que olvides el -n. Por lo general, lo alias en git config.

code_fodder
fuente
2

Todas las respuestas anteriores que verifiqué también enumerarían los archivos a confirmar. Aquí hay una solución simple y fácil que solo enumera los archivos que aún no están en el repositorio y que no están sujetos .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

o

git status --porcelain | grep -v '\?\?'
Frank-Rene Schäfer
fuente
esto no parece funcionar bien con archivos que tienen un espacio en su nombre
ssc
-2

Creo que esto será lo mismo que pretendía el póster original:

git add .

Tim Fulmer
fuente
2
Cada vez que lo haces git/svn add ., el gatito muere.
Nakilon
Je, solo si tienes un montón de cruft en tus copias locales de sucursales remotas;) ¡Crea sucursales locales y podrás git add .con impunidad!
Tim Fulmer
@Nakilon, es por eso que configura .gitignorecorrectamente. Sin embargo, sigue siendo bueno evitarlo git add .. Es mejor git add -u.
Comodín el