¿Están mal vistos varios `.gitignore`?

239

A menos que un repositorio consista en varios proyectos independientes, parece que sería más simple tener un solo .gitignorearchivo en la raíz del repositorio que varios en todo el documento. ¿Existe una mejor práctica estándar sobre esto o algún análisis en línea sobre cuándo un enfoque es mejor que el otro?

Conley Owens
fuente

Respuestas:

254

Puedo pensar en al menos dos situaciones en las que desearía tener varios .gitignorearchivos en diferentes (sub) directorios.

  • Los diferentes directorios tienen diferentes tipos de archivos para ignorar. Por ejemplo, el .gitignoredirectorio superior de su proyecto ignora los programas generados, mientras que Documentation/.gitignoreignora la documentación generada.

  • Ignorar archivos dados solamente en el directorio dado (sub) (se puede utilizar /sub/fooen .gitignore, sin embargo).

Recuerde que los patrones en el .gitignorearchivo se aplican recursivamente al (sub) directorio en el que se encuentra el archivo y todos sus subdirectorios, a menos que el patrón contenga '/' (por ejemplo, el patrón se nameaplica a cualquier archivo nombrado nameen el directorio dado y todos sus subdirectorios, mientras que se /nameaplica al archivo con este nombre solo en el directorio dado).

Jakub Narębski
fuente
1
Ah, por alguna razón pensé que /Documentation/*.html cubriría esto, pero supongo que el comodín * solo coincidirá con los directorios en un nivel.
Conley Owens
99
@ConleyOwens: con Git moderno puede usar Documentation/**/*.html(tenga en cuenta que cualquier barra ancla el patrón; /foose usa para anclar el archivo directamente en el directorio)
Jakub Narębski
97

Como nota tangencial, un caso en el que la capacidad de tener múltiples .gitignorearchivos es muy útil es si desea un directorio adicional en su copia de trabajo que nunca tenga la intención de comprometer. Simplemente coloque un byte .gitignore(que contenga un solo asterisco) en ese directorio y nunca aparecerá en git statusetc.

Aristóteles Pagaltzis
fuente
44
también puede usar el archivo ".git / info / exclude" para eso
Ayell
10
Claro, si no le importa la dificultad de tener que abrir un archivo en una ubicación en algún lugar fuera de la raíz del repositorio, escriba una ruta completa en él y luego recuerde limpiar la entrada si / cuando elimina el directorio. Compare eso con printf \* > .gitignore(la limpieza es automática cuando elimina el directorio). Estoy seguro de que hay situaciones en las que .git/info/excludees la opción más adecuada, pero no muchas.
Aristóteles Pagaltzis
Sí, cuando desea excluir un archivo en lugar de una carpeta, por ejemplo: p
Ayell
44
Dije "si quieres un directorio adicional en tu copia de trabajo que nunca intentes comprometer" en mi respuesta.
Aristóteles Pagaltzis
1
Como crea menos desorden en la raíz .gitignore, me gusta mucho este enfoque.
David A. Gray
59

Puede tener múltiples .gitignore, cada uno por supuesto en su propio directorio.
Para comprobar cuál es la norma gitignore es responsable por ignorar un archivo, uso git check-ignore: git check-ignore -v -- afile.

Y puede tener una versión diferente de un .gitignorearchivo por rama: ya he visto ese tipo de configuración para garantizar que una rama ignore un archivo mientras que la otra no: vea esta pregunta, por ejemplo .

Si su repositorio incluye varios proyectos independientes, sería mejor hacer referencia a ellos como submódulos .
Estas serían las mejores prácticas reales, permitiendo que cada uno de esos proyectos se clone de forma independiente (con sus respectivos .gitignorearchivos), mientras se hace referencia a ellos mediante una revisión específica en un proyecto principal global.
Vea la verdadera naturaleza de los submódulos para más.


Tenga en cuenta que, desde git 1.8.2 (marzo de 2013) puede hacer un git check-ignore -v -- yourfilepara ver a qué gitignore se ejecuta (desde qué .gitignorearchivo) se aplica ' yourfile', y comprender mejor por qué se ignora dicho archivo.
Consulte "¿ qué gitignoreregla está ignorando mi archivo? "

VonC
fuente
17

Pro soltero

  • Fácil de encontrar.

  • Cazar reglas de exclusión puede ser bastante difícil si tengo múltiples gitignore, en varios niveles en el repositorio.

  • Con múltiples archivos, también generalmente terminas con un poco de duplicación.

Pro múltiple

  • Alcanza el "conocimiento" a la parte del árbol de archivos donde se necesita.

  • Dado que Git solo rastrea archivos, un .gitignore vacío es la única forma de confirmar un directorio "vacío".

    (Y antes de Git 1.8, la única forma de excluir un patrón como my/**.exampleera crear my/.gitignorecon el patrón **.foo. Esta razón no se aplica ahora, como puede hacerlo /my/**/*.example).


Prefiero un solo archivo, donde puedo encontrar todas las exclusiones. Nunca me he perdido por directorio .svn, y tampoco voy a perder por directorio .gitignore.

Dicho esto, múltiples gitignores son bastante comunes. Si los usa, al menos sea consistente en su uso para que sea razonable trabajar con ellos. Por ejemplo, puede colocarlos en directorios a solo un nivel de la raíz.

Paul Draper
fuente
"Un .gitignore vacío es la única forma de confirmar un directorio" vacío ". En realidad, encuentro que emptyes más común cargar un solo archivo README (o un archivo llamado así).
Marc.2377
66
.gitkeep es una buena manera de hacer esto también ... solo otra convención. Me gusta la idea de usar un archivo readme, porque entonces podrías explicar para qué se usa el directorio, en ese archivo read me.
Gavin Pickin
8

Hay muchos escenarios en los que desee cometer un directorio para tu repositorio Git, pero sin los archivos que contiene, por ejemplo, la logs, cache, uploadsdirectorios, etc.

Entonces, lo que siempre hago es agregar un .gitignorearchivo en esos directorios con el siguiente contenido:

*
!.gitignore

Con este .gitignorearchivo, Git no rastreará ningún archivo en esos directorios y aún así me permitirá agregar el .gitignorearchivo y, por lo tanto, el directorio en sí mismo al repositorio.

Lukman
fuente