Saltar al contenido

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

Solución:

Puede probar una combinación similar a:

*
!/**/
!*.*

Ese gitignore La regla de exclusión (un patrón negado) debe ignorar todos los archivos, excepto los que tienen una extensión.

Como lo menciona a continuación Mad Physicist, 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)

Es por eso que !/**/ es importante (incluir en la lista blanca las carpetas principales de forma recursiva) si queremos incluir archivos en la lista blanca.

Mencioné esa misma regla en casos similares como:

  • Gitignore todos excepto una carpeta y todo su contenido, independientemente del nivel de anidamiento
  • Git excepto un subdirectorio y sus archivos de un directorio ignorado
  • Gitignore excluye ciertos archivos en todos los subdirectorios

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

Mi consejo:

  • agregue primero el archivo sin extensión que importa
  • luego edita tu .gitignore como 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 un comodín en la ruta que se vuelve a incluir.

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

  • cometer 506d8f1 para git v2.7.0, revertido en el compromiso 76b620d git v2.8.0-rc0
  • confirmar 5e57f9c git v2.8.0-rc0, … revertido (!) en la confirmación 5cee3493 git 2.8.0-rc4.

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í.

*
!*/
!*.*

* 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 el !*/ regla, directorios sin un . en el nombre no aparecería 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 volverá a incluir. 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. Ponga 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 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).

En mis carpetas hay muchos archivos con *.c, *.h, *.txt, *.csv etc extensiones y archivos binarios sin ninguna extensión. Así que necesitaba ignorar todos los archivos excepto *.c,*.h y .gitignore, Así que esto funciona para mí, desde el .gitignore ejemplo:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *