2012-07-18 15 views
88

¿Existe alguna forma práctica de ignorar todos los archivos y carpetas sin seguimiento en un repositorio de git?
(que sé sobre el .gitignore.)git: ¿Cómo ignorar todos los archivos no rastreados?

Así git status podría proporcionar un resultado limpio de nuevo.

+3

Uso indicador '-uno'. – nhahtdh

+0

posible duplicado de [¿Hay alguna manera de hacer que Git no muestre los archivos no rastreados?] (Http://stackoverflow.com/questions/2774416/is-there-a-way-to-get-git-not-to -show-the-untracked-files) – random

+0

O tal vez quiera agregar una sola * a su archivo .gitignore. :) – vilicvane

Respuesta

202

Como ya se ha dicho, para excluir de estado sólo tiene que utilizar:

git status -uno # must be "-uno" , not "-u no" 

Si por el contrario desea ignorar permanentemente los archivos actualmente sin seguimiento se puede, a partir la raíz de su proyecto, inicie:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore 

Cada llamada subsiguiente al git status ignorará explícitamente esos archivos.

ACTUALIZACIÓN: el comando anterior tiene un inconveniente menor: si no tiene un archivo .gitignore sin embargo, su gitignore ignorará sí mismo! Esto sucede porque el archivo .gitignore se crea antes de que se ejecute git status --porcelain. Así que si usted no tiene un archivo .gitignore sin embargo, yo recomendaría el uso de:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore 

Esto crea un subnivel que completa antes se crea el archivo .gitignore.

COMANDO EXPLICACIÓN como estoy recibiendo una gran cantidad de votos (¡gracias!) Creo que será mejor que explique el comando un poco:

  • git status --porcelain se utiliza en lugar de git status --short PORQUE manual estados " Proporcione la salida en un formato fácil de analizar para las secuencias de comandos. Esto es similar a la salida corta, pero se mantendrá estable en todas las versiones de git e independientemente de la configuración del usuario."Así que tenemos tanto el parseability y estabilidad;
  • grep '^??' filtros sólo las líneas que comienzan con ??, que, de acuerdo con el git status manual, corresponden a los archivos sin seguimiento;
  • cut -c4- elimina los 3 primeros caracteres de cada línea, lo que da nosotros sólo la ruta relativa al archivo sin seguimiento;
  • los | símbolos son pipes, que pasan a la salida de la orden anterior a la entrada de la siguiente orden;
  • la >> y > símbolos son redirect operators, que añada la salida de la pr evious comando a un archivo o sobrescribe/crea un nuevo archivo, respectivamente.

otra variante para aquellos que prefieren using sed en lugar de grep y cut, aquí hay otra manera:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore 
+1

Si no hubiera alcanzado mi límite de voto f # $%, definitivamente lo haría ++. – sjas

+2

'cortar -c4-' ** elimina los primeros 4 caracteres de cada línea, lo que nos da solo la ruta relativa al archivo sin seguimiento; ** No. '-c' marca el comienzo de una lista de números de columna para cortar. Y '4-' * selecciona * la línea desde la columna 4 hasta el final, que corta las columnas 1-3. Entonces su comando de corte realmente elimina los primeros 3 caracteres de cada línea. Si eliminó 4 caracteres de una línea de estado de git como la de este archivo aquí: '?? app/views/static_pages/contact.html.erb', eliminaría la primera letra de 'app'. Entonces el comando es correcto, pero la explicación es incorrecta. – 7stud

+0

@ 7stud: gracias, tienes razón, escribí 4 por error. He arreglado la respuesta. – Diego

2

dos maneras:

utilizar el argumento "-uno" a git-estado. He aquí un ejemplo:

[[email protected]_vmware:ft]$ git status 
# On branch ft 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  foo 
nothing added to commit but untracked files present (use "git add" to track) 
[[email protected]_vmware:ft]$ git status -uno 
# On branch ft 
nothing to commit (working directory clean) 

o puede agregar los archivos y directires a .gitignore, en cuyo caso nunca se mostrarán.

+2

Una forma práctica de editar '.gitignore' siendo' git status | cat >> temp && vim temp'. A continuación, edite el archivo para que se eliminen las primeras líneas y la última línea, así como también el '' 'y los espacios en blanco posteriores. Luego 'cat temp >> .gitignore && rm temp'. En caso de que no haya '.gitignore' antes,' mv temp.gitignore' será suficiente. Cosas feas pero mejores que actualizar el '.gitignore' manualmente. – sjas

+1

Esta respuesta es incorrecta. La respuesta correcta es '-uno'. Si usa '-u no', es equivalente a' no -u' - hará un estado en un archivo llamado 'no' (que probablemente no exista) y usará el modo' -u' predeterminado. es decires equivalente a 'git status no' –

10

encontré en the manual

git status -uno

+29

Bueno, si todos quisieran RTFM antes de publicar, ninguno de nosotros recibiría ningún representante :-) –

+4

Pero esta publicación no responde a la pregunta. RTQ parece más apropiado. –

+1

@ Sridhar-Sarnobat Mi respuesta responde mi pregunta, entonces no entiendo lo que intentas decir? – sjas

1

Si tiene una gran cantidad de archivos sin seguimiento, y no quiere " gitignore "todos ellos, tenga en cuenta que, desde git 1.8.3 (April, 22d 2013), git status mencionará el --untracked-files=no, ¡incluso si no agregó esa opción en primer lugar!

"git status" sugiere a los usuarios ver en el uso --untracked=no opción cuando se toma demasiado tiempo.

4

-u no tampoco muestra los archivos sin estado. -uno funciona según lo deseado y muestra sin escena, pero oculta sin seguimiento.

+0

Incluso esto no es del todo correcto. 'git status -u X' es equivalente a' git status X -u' ('X' no es un argumento para' -u'). Esto, a su vez, es equivalente a 'git status X' (porque' -u' sin un argumento es el predeterminado '-u'). Por lo tanto, es simplemente un estado de git en el archivo 'X'. Entonces, si 'X' es' no', simplemente intenta hacer un estado de git en un archivo llamado 'no', que probablemente no tenga –

31

Si desea ignorar estos archivos de forma permanente, una forma sencilla de añadirlos a .gitignore es

git ls-files --others --exclude-standard >> .gitignore 
+3

¿Por qué no recibe tantos votos? ¡No es necesario pasar por otros 2 programas! – JoelFan

+3

@JoelFan: dos razones: 1) ** esta funciona solo desde la raíz del git **, mientras que la aceptada funciona desde cada subdirectorio, solo necesita modificar la ruta de destino '.gitignore' 2) si tiene un directorio no rastreado, ** este lista todos y cada uno de los archivos, pero no el directorio no rastreado ** (por lo que no ignorará el directorio y, por lo tanto, se informará de los futuros archivos en el directorio como no rastreados, mientras que el aceptado enumera solo el directorio, y no los archivos sin seguimiento dentro. Esta es una cuestión de lo que quiere hacer, pero a menudo solo quiere ignorar todo el directorio – Diego

+1

Gracias Poolie Agradezco la diferencia * de * su sugerencia * porque * de los puntos mencionados por @Diego comencé a trabajar con una biblioteca de archivos y carpetas y no quiero rastrear/enviar los archivos originales. Solo quiero rastrear los archivos que agrego o reconstruyo en la biblioteca. Pensilvania las carpetas de alquiler ignorarían todo. Esta/su solución agregó todos los 1696 archivos en un instante. xD – Chaos7703

Cuestiones relacionadas