¿Cómo puedo evitar que .gitignore aparezca en la lista de archivos no rastreados?

971

Acabo de hacer una git initen la raíz de mi nuevo proyecto.

Entonces creé un .gitignorearchivo.

Ahora, cuando escribogit status , el archivo .gitignore aparece en la lista de archivos sin seguimiento. ¿Porqué es eso?

Jacques René Mesrine
fuente
13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair
1
¿Puedo ignorar la carpeta .git / y ponerla en ".gitignore"?
Timo
2
Puede crear un "gitignore" global en su carpeta de inicio en Linux y almacenarlo allí: git config --global core.excludesfile ~ / .gitignore_global
Timo
14
Vine aquí buscando how to gitignore .gitinore filey la pregunta y la respuesta aceptada no están realmente relacionadas con el título. El título podría mejorar.
m.rufca
66
Hay casos de uso para ignorar .gitignore. El flujo de trabajo de mi equipo requiere que cambie un conjunto de archivos para mi entorno de desarrollo local, pero no deben comprometerse. El flujo de trabajo podría mejorarse con una mejor arquitectura, pero está fuera de mis manos. Mientras tanto, hacer que git preste atención a esos archivos es una responsabilidad. Por lo tanto, quiero ignorarlos pero solo a nivel local, y no quiero arriesgarme a cometer mi .gitignore, ya que no debería compartirse con el equipo.
Mark

Respuestas:

959

El .gitignorearchivo debe estar en su repositorio, por lo que debe agregarse y confirmarse, como git statussugiere. Tiene que ser parte del árbol del repositorio, para que los cambios puedan fusionarse y así sucesivamente.

Entonces, agréguelo a su repositorio, no debe ser ignorado.

Si realmente lo desea, puede agregarlo .gitignoreal .gitignorearchivo si no desea que se confirme. Sin embargo, en ese caso, probablemente sea mejor agregar los ignorados a .git/info/excludeun archivo local especial de pago que funciona igual que .gitignore pero no aparece en "estado de git" ya que está en la .gitcarpeta.

Ver también https://help.github.com/articles/ignoring-files

August Lilleaas
fuente
17
¿No debería ser esto parte de los metadatos del repositorio en lugar de un archivo que se rastrea?
endolito
13
Los metadatos del repositorio son locales al repositorio. Si agrega un enlace de compromiso a su repositorio y alguien clona su repositorio, no obtendrá el enlace de compromiso, por ejemplo.
August Lilleaas
9191
@wukong, si estás trabajando en un equipo, ¿no deberían todos ignorar el mismo conjunto de archivos? Es por eso que el archivo .gitignore se agrega al repositorio. Nadie dice que tiene que implementarlo como parte de su proyecto.
Ryan Lundy
13
@endolith y wukong No tiene que ser un archivo en su repositorio. Puede hacer que su configuración de ignorar en muchos lugares diferentes. GitHub tiene un gran artículo sobre él help.github.com/ignore-files Puede tener configuraciones globales de ignorar en cualquier lugar, y puede tener configuraciones específicas de repositorio en los metadatos .git para el repositorio.
Boushley
66
@ deed02392 Al usar estos archivos de ignorar, sin duda necesitas usar el juicio en lo que pones en ellos, pero aún tienen algunos usos geniales. Por ejemplo, uso Vim y en mi gitignore global tengo archivos * .swp marcados como ignorados. De esta manera, no tengo que agregarlo a cada uno de mis proyectos, y los chicos que nunca usan vim no tienen que preocuparse por eso.
Boushley
282

Si desea almacenar la lista de archivos ignorados fuera de su árbol Git, puede usar el archivo .git / info / exclude . Se aplica solo a su pago del repositorio.

Paweł Hajdan
fuente
19
+1, esto es ideal para ignoraciones que no están relacionadas con el proyecto, como archivos de copia de seguridad de emacs * ~, .DS_Store de OS X, etc.
Agosto Lilleaas
38
@AugustLilleaas Personalmente prefiero poner este tipo de archivos específicos de {editor, plataforma} ~/.gitignorepara que se ignoren en cualquier repositorio en el que trabajo.
Michael Mior
22
Una vez que se rastrea un archivo, puede usarlo git update-index --assume-unchanged <file>para detener el seguimiento de los cambios sin cambiar su repositorio. Esto es muy útil en grandes proyectos compartidos donde necesita realizar cambios locales, pero nadie más quiere ver sus cosas comprometidas con el repositorio. Ver blog.pagebakers.nl
Chris Esplin
66
@AugustLilleaas: gitignore por usuario es mejor para ese caso de uso.
Caracol mecánico el
3
gracias por este consejo, estoy usando git-svn para que los otros usuarios del repositorio svn en el servidor no quieran exactamente .gitignore registrado.
enormel76
74

En realidad, podría poner una línea .gitignoreen su .gitignorearchivo. Esto haría que .gitignoregit ignorara el archivo. Realmente no creo que sea una buena idea. Creo que el archivo de ignorar debe ser controlado y controlado por la versión. Solo pongo esto para completar.

1800 INFORMACIÓN
fuente
77
¡Trabajó para mi! versión 1.5.6.5. También estoy de acuerdo con 1800 INFORMATION en que no es una buena idea, pero creo que podría estar bien en ciertos contextos (digamos que usa un repositorio git-svn y no desea que los archivos git-ish vayan a svn). El archivo de exclusión es probablemente mejor.
J. Polfer
44
@ehsanul: el archivo no debe ser rastreado (no debería haberlo agregado ni confirmado). Puedes descubrirlo. Probablemente esta no sea una gran idea en un entorno de solo git, pero si sucede que, por ejemplo, usa git como un cliente inteligente para un repositorio de subversión (sin que el resto lo sepa, <risa maníaca>), tal truco es genial.
Tomasz Gandor
2
@IshanSrivastava Probablemente ya haya rastreado el archivo. Intenta corrergit rm --cached .gitignore
Gideon el
51

También puede tener un .gitignorearchivo git de usuario global que se aplicará automáticamente a todos sus repositorios. Esto es útil para IDE y archivos de edición (por ejemplo, swpy *~archivos para Vim). Cambie las ubicaciones de directorio para adaptarse a su sistema operativo.

  1. Añadir a su ~/.gitconfigarchivo:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Cree un ~/.gitignorearchivo con patrones de archivo para ignorar.

  3. Guarde sus archivos de puntos en otro repositorio para que tenga una copia de seguridad (opcional).

Cada vez que copie, inicie o clone un repositorio, también se usará su archivo global de gitignore.

Alec el friki
fuente
66
Creo que esta es la mejor solución para situaciones en las que sus editores dejan archivos temporales, por ejemplo. *. Swp (VIM) y ._ * (TM), ya que no tendría sentido agregar continuamente estas reglas a cada repositorio git, y para obligar a otros usuarios con IDE diferentes a buscar estos archivos.
Thomas Hunter II
1
Esto funciona de manera brillante para ignoraciones que no deberían ser empujadas a ninguna rama. Reemplace 'nombre de usuario' con su nombre de usuario real, por supuesto, y no agregue una segunda sección [core] a .gitconfig si ya tiene uno, simplemente coloque la línea excludefile debajo de su sección [core] existente.
esmerilado
47

Si alguien ya ha agregado un .gitignorea su repositorio, pero desea hacer algunos cambios y hacer que se ignoren, haga lo siguiente:

git update-index --assume-unchanged .gitignore

Fuente .

Leif Gruenwoldt
fuente
55
Mala idea, existe una razón .git/info/excludes.
Arrowmaster
66
Supongo que también existe una razón --assume-unchanged. ¿Por qué es uno mejor que el otro?
Leif Gruenwoldt
99
Y por cierto .git/info/excludesno funciona si el archivo ya está rastreado.
Leif Gruenwoldt
Esto realmente me ayudó con un .gitignore que ya estaba comprometido y para el que no deseaba realizar cambios. Estoy ejecutando git 1.7.4.1 desde repositorios Ubuntu 11.04 y las páginas de ayuda agregan esto en el índice de actualización. "Esta opción también se puede usar como un mecanismo de nivel de archivo grueso para ignorar los cambios no confirmados en los archivos rastreados (similar a lo que hace .gitignore para los archivos no rastreados). Git fallará (con gracia) en caso de que necesite modificar este archivo en el índice por ejemplo, cuando se fusiona en una confirmación; por lo tanto, en caso de que el archivo supuesto no rastreado se cambie en sentido ascendente, deberá manejar la situación manualmente ".
YonahW
Voto por esta respuesta porque generalmente necesitará esta acción para su estado inicial de repositorio principal y mantendrá los beneficios de la funcionalidad git. No hay una buena razón para ignorar este archivo (punto)
Lazaros Kosmidis
37

Después de agregar el .gitignorearchivo y confirmarlo, ya no aparecerá en la lista de "archivos no rastreados".

git add .gitignore
git commit -m "add .gitignore file"
git status
Greg Hewgill
fuente
20

Solo en caso de que alguien más tenga el mismo dolor que nosotros. Queríamos excluir un archivo que ya se había confirmado.

Esta publicación fue mucho más útil: trabajar con .git / info / exclude demasiado tarde

Específicamente, lo que necesita para ignorar un archivo es usar el comando git remove See git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

lo pruebas yendo

git rm --dry-run *.log
(si dice que desea excluir todos los archivos de registro)

esto generará lo que se excluiría si lo ejecutara.

entonces

lo ejecutas yendo

git rm *.log
(o la ruta / expresión de nombre de archivo que desee)

Luego agregue una *.loglínea a su .gitignorearchivo.

Evolucionar
fuente
44
Por supuesto, es posible que desee seguir esto agregando los patrones relevantes (es decir, * .log) a su .gitignore, para que no se abarroten git statussi aparecen en el futuro.
Patrick O'Leary
2
Aunque mi problema no estaba relacionado con los OP: gracias por dejarme saber que necesitaría usar RM para "limpiar" mi repositorio después de hacer cambios en .gitignore (si los archivos ya se han iniciado). Lo sé, pero este fue el primer lugar en el que personalmente he visto a alguien mencionar eso.
Mike
Gracias por la respuesta. Sí, por eso lo escribí, después de haber venido aquí y luego recorrer el camino para resolver esto también, pensé que sería bueno escribirlo. :)
Evoluciona el
16

Por supuesto, el archivo .gitignore se muestra en el estado, porque no está rastreado, ¡y git lo ve como un nuevo archivo sabroso para comer!

Sin embargo, dado que .gitignore es un archivo sin seguimiento, es un candidato que git ignorará cuando lo coloque en .gitignore.

Entonces, la respuesta es simple: solo agregue la línea:

.gitignore # Ignore the hand that feeds!

a su archivo .gitignore!

Y, contrariamente a la respuesta de agosto, debería decir que no es que el archivo .gitignore deba estar en su repositorio. Simplemente sucede que puede ser, lo que a menudo es conveniente. Y probablemente sea cierto que esta es la razón por la cual .gitignore se creó como una alternativa a .git / info / exclude, que no tiene la opción de ser rastreado por el repositorio. En cualquier caso, la forma en que use su archivo .gitignore depende totalmente de usted.

Como referencia, consulte la página de manual de gitignore (5) en kernel.org.

persecución
fuente
15

La idea es colocar archivos que sean específicos de su proyecto en el .gitignorearchivo y (como ya se mencionó) agregarlo al repositorio. Por ejemplo .pycy .oarchivos, registros que crea el testuite, algunos accesorios, etc.

Para los archivos que crea su propia configuración, pero que no necesariamente aparecerán para todos los usuarios (como .swparchivos si usa vim, directorios ocultos ocultos y similares), debe usar .git/info/exclude(como ya se mencionó).

bayer
fuente
14

En primer lugar, como muchos otros ya dijeron, .gitignoreGit debería rastrearlo (y, por lo tanto, no debería ignorarse). Déjame explicarte por qué.

(TL; DR: confirme el .gitignorearchivo y use un global.gitignore para ignorar los archivos creados por su IDE o sistema operativo)

Git es, como probablemente ya sepa, un sistema de control de versiones distribuido . Esto significa que le permite alternar entre diferentes versiones (incluso si el desarrollo se ha dividido en diferentes ramas) y también permite que varios desarrolladores trabajen en el mismo proyecto.

Aunque el seguimiento de su .gitignoretambién tiene beneficios cuando cambia entre instantáneas, la razón más importante para confirmarlo es que querrá compartir el archivo con otros desarrolladores que están trabajando en el mismo proyecto. Al comprometer el archivo en Git, otros contribuyentes obtendrán automáticamente el .gitignorearchivo cuando clonen el repositorio, por lo que no tendrán que preocuparse por cometer accidentalmente un archivo que no debería confirmarse (como archivos de registro, directorios de caché, credenciales de bases de datos) , etc.) Y si en algún momento .gitignorese actualiza el proyecto , simplemente pueden introducir esos cambios en lugar de tener que editar el archivo manualmente.

Por supuesto, habrá algunos archivos y carpetas que querrá ignorar, pero que son específicos para usted y no se aplican a otros desarrolladores. Sin embargo, esos no deberían estar en el proyecto.gitignore . Hay otros dos lugares donde puede ignorar archivos y carpetas:

  • Los archivos y carpetas creados por su sistema operativo o IDE deben colocarse en un archivo global.gitignore . El beneficio es que esto .gitignorese aplica a todos los repositorios en su computadora, por lo que no tiene que repetir esto para cada repositorio. Y no se comparte con otros desarrolladores, ya que podrían estar utilizando un sistema operativo y / o IDE diferente.
  • Los archivos que no pertenecen al proyecto .gitignore, ni al global .gitignore, pueden ignorarse utilizando exclusiones de depósito explícitas enyour_project_directory/.git/info/exclude . Este archivo no se compartirá con otros desarrolladores y es específico para ese repositorio único
Nic Wortel
fuente
Buena mención para global.gitignore
Gruber
Creo que después de la configuración inicial, el archivo .gitignore debe ignorarse, por lo que no hay cambios accidentales. No significa que ya no se pueda cambiar, pero de alguna manera está protegido de accidentes. Los accidentes en ese archivo pueden introducir confusión o incluso poner en peligro algún trabajo, por lo que también debe considerarse el "sellado" (ignorarse a sí mismo).
Sasa
@Sasa .gitignoresolo funciona para ignorar los archivos que Git aún no está rastreando. Agregar un archivo ya rastreado .gitignoreno le impedirá que realice cambios en ese archivo. Incluso si esto fuera posible, ¿cómo comprometerías el cambio .gitignorecuando le indica a Git que se ignore a sí mismo?
Nic Wortel
@Nic - He pasado la explicación detallada a mi punto de vista en la respuesta separada @ al final de este hilo.
Sasa
12

Tenga cuidado con el siguiente "problema" A veces desea agregar directorios pero no archivos dentro de esos directorios. La solución simple es crear un .gitignore con el siguiente contenido:

*

Esto parece funcionar bien hasta que se da cuenta de que el directorio no se agregó (como se esperaba a su repositorio. La razón de esto es que .gitignore también será ignorado, y por lo tanto el directorio está vacío. Por lo tanto, debe hacer algo como esto :

*
!.gitignore
Laberinto
fuente
9

Esto parece funcionar solo para que su directorio actual Gitignore todos los archivos del repositorio.

actualizar este archivo

.git/info/exclude 

con su comodín o nombre de archivo

*pyc
*swp
*~
Naskov
fuente
5

Si ya ha registrado .gitignore y desea ignorar las modificaciones, consulte esta respuesta :

Intenta usar este comando:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Para revertirlo (si alguna vez desea confirmar cambios), use:

git update-index --no-assume-unchanged

ACTUALIZACIÓN :

Aquí le mostramos cómo enumerar los archivos 'asumir sin cambios' en el directorio actual:

git ls-files -v | grep -E "^[a-z]"

Como la -vopción usará letras minúsculas para los archivos 'asumir sin cambios'.

Aaron
fuente
4

En mi caso, quiero excluir un archivo existente. Solo modificar .gitignore no funciona. Seguí estos pasos:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

De esta manera, limpié del caché el archivo que quería excluir y después lo agregué a .gitignore .

Andrea Perdicchia
fuente
La mejor solución para mí. También puedes usar git add. en segundo lugar, después de eso git commit -m "arreglando .gitignore"
brainray
3

Navegue al directorio base de su repositorio de git y ejecute el siguiente comando:

echo '\\.*' >> .gitignore

Todos los archivos de puntos serán ignorados, incluido ese molesto .DS_Store si está en una Mac.

debilitar
fuente
44
Yo no haría eso. Puede haber archivos de puntos que necesite. En cambio, simplemente agregaría .gitignore y .DS_Store literalmente.
Edward Falk
2

Es muy posible que un usuario final quiera que Git ignore el archivo ".gitignore" simplemente porque las carpetas específicas de IDE creadas por Eclipse probablemente no sean las mismas que NetBeans u otro IDE. Por lo tanto, para mantener el código fuente IDE antagónico, hace que sea más fácil ignorar un git personalizado que no se comparte con todo el equipo, ya que los desarrolladores individuales pueden estar usando IDE diferentes.

John Brown
fuente
1

.gitignorese trata de ignorar otros archivos. git se trata de archivos, por lo que se trata de ignorar archivos. Sin embargo, como git funciona con archivos, este archivo debe estar allí como mecanismo para enumerar los otros nombres de archivo.

Si se llamara .the_list_of_ignored_files , podría ser un poco más obvio.

Una analogía es una lista de tareas pendientes que NO desea hacer. A menos que los enumere en alguna parte, hay algún tipo de lista de tareas pendientes que no sabrá sobre ellos.

Michael Durrant
fuente
1

Creo que hay situaciones en las que ignorar el .gitignore es muy útil. Por ejemplo, cuando tiene varios equipos o un equipo grande trabajando en la misma base de código. En ese caso, debe tener ciertas convenciones, una de ellas es lo que se ignora en el repositorio de git. Por lo general, se trata de ignorar los archivos y directorios creados por IDE u OS, algunos registros generados, etc.

Sin embargo, existe una fuerza que tiende a introducir cambios no convencionales en el .gitignorearchivo. El .gitignorearchivo puede ser modificado por una persona irresponsable, por error, por una herramienta que se utiliza, o en algún otro caso.

Para tener una fuerza contraria a esto, podemos hacer lo siguiente:

  1. El .gitignore inicial debe reflejar la convención en equipo (s),
  2. Después de presionarlo, el .gitignore debe asegurarse agregando la entrada .gitignore y presionando ese cambio nuevamente. El .gitignorearchivo está " sellado " de esta manera.

El " sellado ".gitignore archivo se puede cambiar, solo localmente, sin propagar esos modificadores a otros miembros del equipo. Sin embargo, si un cambio está ampliamente acordado en todo el equipo, entonces es posible "abrirlo", cambiarlo y luego "sellarlo" nuevamente. Eso no se puede hacer por error, solo intencionalmente.

Lamentablemente, no puede estar 100% protegido de la estupidez, pero de esta manera ha hecho todo lo posible para evitar que sucedan cosas estúpidas.

Si tienes un equipo relativamente pequeño con muy buenos profesionales, entonces esto no sería importante, pero incluso esos muchachos apreciarían tener una cosa menos de qué preocuparse.

Usar .git/info/excludees genial cuando no puedes hacer nada con respecto a la configuración de la infraestructura, solo cubre tu propio ** para no cometer un error.

Desde un punto de vista de lo que está bien y lo que está mal, estoy votando por tener una entrada .gitignore dentro del .gitignorearchivo, dando a todos la libertad de hacer localmente lo que quieran, pero sin invadir a otros.

Sasa
fuente
0

Encontré que el mejor lugar para configurar ignorar los molestos .DS_Storearchivos es en el .git/info/excludearchivo.

IntelliJ parece hacer esto automáticamente cuando configura un repositorio git en él.

Stephen McConnell
fuente
1
El archivo de ignorar global del usuario sería un mejor lugar para ignorar .DS_Store
Max Nanasy