¿Cómo agrego archivos sin puntos (todos los archivos sin extensión) al archivo gitignore?

111

Como dice el título, ¿es posible agregar "archivos sin puntos" al archivo gitignore?

Me imagino que esto se encargaría de todos esos molestos archivos sin extensión.

El gato unfun
fuente
2
Hay algunos archivos sin extensión que usted no quiere hacer caso omiso de: README, LICENSEo COPYING, INSTALL, Makefileetc., aunque siempre se puede forzar-añaden ellos y luego se realiza un seguimiento
Jakub Narębski
@ JakubNarębski buen punto. Lo he incluido en mi respuesta para mayor visibilidad.
VonC
posible duplicado de gitignore sin archivos binarios
Mad Physicist

Respuestas:

121

Puede probar una combinación similar a:

*
!/**/
!*.*

Esa gitignoreregla de exclusión (un patrón negado ) debería ignorar todos los archivos, excepto los que tienen una extensión.

Como se menciona más adelante por Mad físico , la regla es:

No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo. (*)
(*: a menos que se cumplan ciertas condiciones en git 2.?+, ver más abajo)

Por eso !/**/es importante (hacer una lista blanca de las carpetas principales de forma recursiva) si queremos hacer una lista blanca de los archivos.

Mencioné esa misma regla en casos similares como:


Como comenta Jakub Narębski , es posible que no desee ignorar todos los archivos sin extensión.

Mi consejo:

  • agregue primero el archivo sin extensión que importa
  • luego edite su .gitignorecomo se muestra arriba: los archivos ya versionados no serán ignorados (incluso si no tienen una extensión). Todos los demás serán ignorados.

Para cualquier archivo sin extensión futuro que desee versionar:

git add -f -- myFile

Tenga en cuenta que con git 2.9.x / 2.10 (¿mediados de 2016?), Podría ser posible volver a incluir un archivo si se excluye un directorio principal de ese archivo si no hay comodines en la ruta que se vuelve a incluir .

Nguyễn Thái Ngọc Duy ( pclouds) está intentando agregar esta función:

Sin embargo, dado que una de las reglas para la reincorporación fue:

La parte del directorio en las reglas de reincorporación debe ser literal (es decir, sin comodines)

De todos modos, esto no habría funcionado aquí.

VonC
fuente
1
La respuesta es completamente correcta. Pero quizás una mejor .gitignoresería **y !**.*. Sé que esto no hace una diferencia si el asterisco se coloca al frente, pero es más explícito y sólido con la forma en que los proyectiles manejan los comodines ...
Willem Van Onsem
7
Nota: para trabajar con otras reglas de exclusión, este deberá ser el primer conjunto de reglas en su archivo .gitignore
Erik
También puede volver a incluir ciertos archivos sin extensión, por ejemplo, con !Makefile. Tenga en cuenta que tuve problemas con esta solución en Git 1.7.1 mientras funcionaba bien en 1.9.0. En mi caso, agregar un archivo en el directorio raíz funcionó bien, pero agregar un archivo con una extensión dentro de un subdirectorio se mostró como ignorado. Esto parece deberse a que 1.7.1 aún no era compatible con el **patrón, ¡mira aquí !
mxmlnkn
1
**fue agregado en Git 1.8.2. ¿Existe alguna desventaja sobre el uso en !*/lugar de !/**/?
mxmlnkn
@TamaMcGlinn Eso parece una expresión regular: gitignore no admite expresiones regulares.
VonC
50
*
!*/
!*.*

* le dice a git que ignore todo.

!*/luego deja de ignorar todo lo que sea un directorio. Esto es crucial.

!*.* deja de ignorar todos los archivos con una extensión.

Sin la !*/regla, los directorios sin un .nombre no se incluirían en la lista y ninguno de los archivos deseados se agregaría fuera de la carpeta raíz.

Como referencia, lea estas dos secciones en la documentación .gitignore que se destacan:

Un prefijo opcional "!" que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente. No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo. Git no enumera los directorios excluidos por razones de rendimiento, por lo que los patrones en los archivos contenidos no tienen ningún efecto, sin importar dónde estén definidos. Coloque una barra invertida ("\") delante del primer "!" para patrones que comienzan con un "!" literal, por ejemplo, "! important! .txt".

Si el patrón termina con una barra, se elimina con el propósito de la siguiente descripción, pero solo encontrará una coincidencia con un directorio. En otras palabras, foo / coincidirá con un directorio foo y las rutas debajo de él, pero no coincidirá con un archivo normal o un enlace simbólico foo (esto es consistente con la forma en que pathpec funciona en general en Git).

Físico loco
fuente
1
Buena atrapada. +1. Me había olvidado de actualizar mi respuesta con esa regla que había usado recientemente en otras respuestas de minas. He actualizado mi respuesta en consecuencia.
VonC
0

En mis carpetas hay muchos archivos con *.c, *.h, *.txt, *.csvextensiones, etc. y archivos binarios sin ninguna extensión. Así que necesitaba ignorar todos los archivos excepto *.c,*.hy .gitignore, así que esto funciona para mí, del .gitignoreejemplo:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Antranig Avakian
fuente