2010-09-27 16 views
223

¿Hay alguna manera de usar un comando como git ls-files para mostrar solo los archivos sin seguimiento?Git: enumere solo los archivos "sin seguimiento" (también, comandos personalizados)

La razón por la que estoy pidiendo es porque uso el siguiente comando para procesar todos los archivos borrados:

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 

yo era capaz para encontrar la opción -o en git ls-files, pero esto no es lo que quiero porque también muestra archivos ignorados. También tuve la oportunidad de llegar a la siguiente comando larga y desagradable:

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

Parece que no tiene que ser un mejor dominio puedo usar aquí. Y si no lo hay, ¿cómo creo comandos personalizados de git?

+0

¿Podría explicar por qué necesita 'git ls-files -d | xargs git rm'? – takeshin

+0

Eso elimina todos los archivos que faltan avisos git. Mi pregunta era acerca de cómo hacer una operación relacionada: agregue todos los archivos que git no esté rastreando actualmente. Por lo general, hago ambas cosas después de cambiar el nombre, combinar y/o dividir mis archivos de código. – jnylen

+0

Si faltan, ¿no están ya eliminados? A menos que ... hayas salido de otra parte y luego intentes sincronizar con control remoto ... Creo que lo entiendo. –

Respuesta

369

Para una lista de archivos sin seguimiento tratan:

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

Niza alias para añadir archivos sin seguimiento:

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

Editar: Como referencia: git-ls-files

+5

¡Perfecto! ¿Qué significa '!' Al principio de la línea de alias, o ¿dónde está eso documentado? – jnylen

+12

@jnylen: '!'ejecuta el comando bash para que pueda usar' $ (...) ' – takeshin

+1

configuración de ayuda git – Dustin

50

Si lo que desea es eliminar los archivos sin seguimiento, hacer esto:

git clean -df 

añadir x a que si quiere también incluir archivos ignorado específicamente. Uso git clean -dfx a lote durante todo el día.

Puede crear git personalizado simplemente escribiendo un script llamado git-whatever y teniendo en su camino.

+0

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 está documentado ese mecanismo? – jnylen

+4

Simplemente haga 'git add -A' o' git add -u' (dependiendo de cuál tenga más sentido para usted) – Dustin

+0

Su comentario es la respuesta real, que también se repite más tarde por @Mike Lococo – andho

23

Los accidentes respuesta aceptada en los nombres de archivo con espacio. No puedo opinar sobre ella (bajo puntaje de stackoverflow hasta ahora), y estoy en este momento no está seguro de cómo actualizar el comando alias, así que voy a poner la versión mejorada aquí:

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

git add -A -n harán lo usted quiere. -A agrega todos los archivos sin seguimiento al repositorio, -n lo convierte en dry-run donde no se realiza el complemento, pero se proporciona el resultado de estado que enumera cada archivo que habría agregado.

+4

¡Esta es una excelente respuesta! Tenga en cuenta que excluye archivos en archivos '.gitignore', que generalmente es lo que queremos, pero si no,' git add -fAn'. – cdunn2001

+0

Esta parece ser la mejor respuesta. –

+0

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 realmente. Perfecto. ¡Gracias! – digitguy

0

Creo que esto por lo que el mismo que el cartel original previsto:

git add .

+2

Cada vez que haces 'git/svn add .', el gatito muere. – Nakilon

+0

Heh, solo si tienes un montón de cruq en tus copias locales de sucursales remotas;) Crea sucursales locales y ¡puedes 'git add .' con total impunidad! –

12

Todo es muy simple

Para obtener la lista de todos los archivos sin seguimiento uso de comandos de estado git con opción -u (--untracked-files)

git status -u 
+0

¿Qué tal una versión no recursiva de eso? – David

+0

Desafortunadamente, también muestra el archivo ignorado a través de los archivos .gitignore. – Plouff

+3

Esta es la única respuesta que mostró mis archivos ignorados en la confirmación inicial, pero tuve que agregar '--ignored' al comando' git status -u' –

5

Al buscar archivos para agregar potencialmente. La salida de git show hace 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 los archivos que coinciden con un patrón específico y después de tuberías que a git add.

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

Sé que es una vieja pregunta, pero en términos de listas de archivos sin seguimiento pensé que iba a añadir otro que también muestra las carpetas sin seguimiento:

Puede utilizado la operación de limpieza con git -n (seca ejecución) para mostrar los archivos que se eliminará (incluyendo los archivos .gitignore) por:

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 sin seguimiento (incluyendo ignorado por git y otros, como resultado de generación etc ...)
  • d - muestran los directorios sin seguimiento
  • n - y lo más importante ! - dryrun, es decir, no elimine nada, solo use el mecanismo de limpieza para mostrar los resultados.
Cuestiones relacionadas