git: ¿Cómo ignorar todos los archivos actuales no rastreados?

131

¿Hay alguna manera práctica de ignorar todos los archivos y carpetas sin seguimiento en un repositorio git?
(Sé sobre el .gitignore.)

Por git statuslo tanto , proporcionaría un resultado limpio nuevamente.

sjas
fuente
O puede que desee agregar un solo * a su archivo .gitignore. :)
vilicvane
1
Es *muy probable que un testamento no sea lo que quieres.
sjas
Sorprendido por tantas respuestas incorrectas. -u noEstá Mal. -unoes correcto. -u notrata de hacer un estado en un archivo llamado no! El nono es un argumento para . Para forzar a ser interpretado como un argumento para , no debe haber espacio. Para probar esto, haz y compara con . -uno-utouch Invalidgit status -uInvalidgit status -u Invalid
Aaron McDaid el

Respuestas:

251

Como ya se dijo, para excluir del estado solo use:

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

Si, en cambio, desea ignorar permanentemente los archivos no rastreados actualmente, puede, desde la raíz de su proyecto, iniciar:

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

Cada llamada posterior a git statusignorará explícitamente esos archivos.

ACTUALIZACIÓN : el comando anterior tiene un inconveniente menor: si aún no tiene un .gitignorearchivo, ¡su gitignore se ignorará a sí mismo! Esto sucede porque el archivo .gitignorese crea antes de que git status --porcelainse ejecute. Entonces, si aún no tiene un .gitignorearchivo, le recomiendo usar:

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

Esto crea una subshell que se completa antes de.gitignore crear el archivo.

EXPLICACIÓN DE MANDO ya que recibo muchos votos (¡gracias!) Creo que es mejor que explique un poco el comando:

  • git status --porcelain se usa en lugar de git status --short porque el manual dice "Proporcione la salida en un formato fácil de analizar para los scripts. 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". Entonces tenemos tanto la capacidad de análisis como la estabilidad;
  • grep '^??' filtra solo las líneas que comienzan con ?? , que, de acuerdo con el manual de estado de git , corresponden a los archivos no rastreados;
  • cut -c4- elimina los primeros 3 caracteres de cada línea, lo que nos da solo la ruta relativa al archivo sin seguimiento;
  • el | símbolos son tuberías , que pasan la salida del comando anterior a la entrada del siguiente comando;
  • los símbolos >>y >son operadores de redireccionamiento , que agregan la salida del comando anterior a un archivo o sobrescribe / crea un nuevo archivo, respectivamente.

OTRA VARIANTE para aquellos que prefieren usar ensed lugar de grepy cut, aquí hay otra forma:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Diego
fuente
3
cut -c4- elimina los primeros 4 caracteres de cada línea, lo que nos da solo la ruta relativa al archivo sin seguimiento; No. -cmarca 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. Por lo tanto, su comando de corte en realidad 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.erbeliminaría la primera letra de app. Entonces el comando es correcto, pero la explicación es defectuosa.
7stud
@ 7stud: gracias, tienes razón, escribí 4 por error. He arreglado la respuesta.
Diego
2
Realmente aprecio la explicación del comando. Es bueno saber qué están haciendo los comandos aleatorios que copié de Internet, y nos ayuda a todos a aprender a usar la línea de comandos y a mejorar.
Eric Fitting
1
-u nono funciona para mi Pero lo -unohace. He actualizado la respuesta en consecuencia. Este es un diseño extraño para git. Estoy en git 1.7.1
Aaron McDaid el
2
@AaronMcDaid: gracias. El cambio se documenta aquí y se discute aquí
Diego
51

Si desea ignorar permanentemente estos archivos, una forma sencilla de agregarlos .gitignorees:

  1. Cambia a la raíz del árbol git.
  2. git ls-files --others --exclude-standard >> .gitignore

Esto enumerará todos los archivos dentro de directorios no rastreados, que pueden o no ser lo que desea.

billar
fuente
3
¿Por qué esto no obtiene tantos votos? ¡No es necesario pasar por otros 2 programas!
JoelFan
44
@JoelFan: dos razones: 1) esta solo funciona desde la raíz del git , mientras que la aceptada funciona desde todos los subdirectorios, solo necesita ajustar la .gitignoreruta de destino 2) si tiene un directorio sin seguimiento, este enumera cada uno y cada archivo en él, pero no el directorio sin seguimiento en sí mismo (por lo que no ignorará el directorio y, por lo tanto, aún recibirá informes de futuros archivos en el directorio como no seguidos, mientras que el aceptado enumera solo el directorio y no los archivos sin seguimiento dentro Esto es una cuestión de lo que quieres hacer, pero a menudo solo quieres ignorar todo el directorio
Diego
1
Gracias, Poolie. Aprecio la diferencia de su sugerencia debido a 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 archivos que agrego o reconstruyo en la biblioteca. Agregar las carpetas principales ignoraría todo. Esta / su solución agregó todos los 1696 archivos en un instante. xD
Chaos7703
Esto también se puede lograr usando git config status.showUntrackedFiles no.
larsch
16

Lo encontré en el manual.

El parámetro mode se usa para especificar el manejo de archivos no rastreados. Es opcional: por defecto es todo, y si se especifica, debe estar pegado a la opción (por ejemplo, -uno, pero no -u no).

git status -uno

sjas
fuente
39
Bueno, si todos tuvieran RTFM antes de publicar, ninguno de nosotros obtendría ningún representante :-)
Jenny D
4

Dos caminos:

usa el argumento "-uno" para git-status. Aquí hay un ejemplo:

[jenny@jenny_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)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

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

Jenny D
fuente
2
Una forma práctica de editar el .gitignoreser git status | cat >> temp && vim temp. Luego edite el archivo para que se eliminen las primeras líneas y la última línea, así como el final #y el espacio en blanco después. Entonces cat temp >> .gitignore && rm temp. En caso de que no .gitignoreestuviera presente antes, mv temp .gitignorelo hará. Cosas feas pero mejores que actualizarlas .gitignoremanualmente.
sjas
1
Esta respuesta es incorrecta. La respuesta correcta es -uno. Si lo usa -u no, es equivalente a no -u: hará un estado en un archivo llamado no(que probablemente no exista) y usará el -umodo predeterminado . es decir, es equivalente agit status no
Aaron McDaid
3

-u notampoco muestra archivos sin clasificar. -unofunciona como se desea y se muestra sin etapas, pero se oculta sin seguimiento.

fútbol americano
fuente
1
Incluso esto no es del todo correcto. git status -u Xes equivalente a git status X -u( Xno es un argumento para -u). Esto, a su vez, es equivalente a git status X(porque -usin argumento es el valor predeterminado -u). Por lo tanto, es simplemente un estado git en el archivo X. Entonces, si Xes noasí, simplemente intenta hacer un estado git en un archivo llamado no, que probablemente no tenga
Aaron McDaid
2

En caso de que no esté en Unix como el sistema operativo, esto funcionaría en Windows con PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Sin embargo, el .gitignorearchivo debe tener una nueva línea vacía, de lo contrario, agregará texto a la última línea sin importar si tiene contenido.

Esta podría ser una mejor alternativa:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

vhanla
fuente
1

Si tiene muchos archivos no rastreados y no quiere " gitignore" todos ellos, tenga en cuenta que, desde git 1.8.3 (22 de abril de 2013) , git statusmencionará --untracked-files=noincluso si no agregó esa opción en el ¡primer lugar!

" git status" sugiere a los usuarios que busquen usar la --untracked=noopción cuando lleva demasiado tiempo.

VonC
fuente
0

Vine aquí tratando de resolver un problema ligeramente diferente. Tal vez esto sea útil para alguien más:

Creo una nueva sucursal feature-a. Como parte de esta rama, creo nuevos directorios y necesito modificar .gitignore para suprimir algunos de ellos. Esto sucede mucho al agregar nuevas herramientas a un proyecto que crea varias carpetas de caché. .serverless,.terraform etc.

Antes de que esté listo para fusionar eso con el master, aparece algo más, así que pago masternuevamente, pero ahoragit status recupero esas carpetas suprimidas, ya que .gitignore aún no se ha fusionado.

La respuesta aquí es realmente simple, aunque tuve que encontrar este blog para resolverlo:

Solo revisa el archivo .gitignore de la feature-asucursal

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
William George
fuente