git ignora la excepción

326

Tengo un archivo gitignore que hace que git ignore los *.dllarchivos, y ese es realmente el comportamiento que quiero. Sin embargo, si quiero una excepción (es decir, para poder comprometerme foo.dll), ¿cómo puedo lograr esto?

crisis redonda
fuente
8
posible duplicado de Excepciones en .gitignore
wallyk
fwiw, el abuelo de las respuestas duplicadas sobre este tema, una que debería revisar, probablemente sería Hacer que .gitignore ignore todo excepto algunos archivos , actividad muy regular y varias buenas respuestas. Soy un fanático particular de esta respuesta , que parece clara y exhaustiva.
Kay V

Respuestas:

447

Utilizar:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

De gitignore :

Un prefijo opcional! que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se volverá a incluir. Si un patrón negado coincide, esto anulará las fuentes de patrones de precedencia inferior.

Drilldrick
fuente
22
Vea también el formulario de respuesta @Matiss Jurgelis - es una adición importante
Dan
77
¿Puedo agregar la excepción al gitignore de mi proyecto y no a mi gitignore global? Por ejemplo, si quisiera incluir todas las DLL en un directorio? Mi gitignore_global tiene *.dll, y el gitignore de mi proyecto tiene !Libs/*.dllpero eso no parece estar funcionando.
Joel Kinzel el
1
@jkinz, deberías intentarlo !Libs/**/*.dll.
Rosberg Linhares
@RosbergLinhares O !**/Libs/*.dll, dependiendo de la estructura de la carpeta.
JAB
2
Gracias, pero en una Mac agregando el comentario en la misma línea !foo.dllque invalida el comando. Si agrego el comentario en una fila separada, funciona.
Giacomo
261

Git ignora las carpetas si escribes:

/js

pero no puede agregar excepciones si lo hace: !/js/jqueryo !/js/jquery/o!/js/jquery/*

Debes escribir:

/js/* 

y solo entonces puedes excepto subcarpetas como esta

!/js/jquery
Matiss
fuente
44
Eso es muy importante ¡Gracias!
VisioN
3
Sin embargo, parece que no puede agregar carpetas anidadas, por ejemplo !/js/jquery/xyzlib, no será ignorado ...
Ignorante
2
Como dice @Ignorant, la carpeta que "excepto" de la regla de ignorar, debe estar en la misma ubicación que el "*"
The Red Pea
3
por lo que /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Se siente como una forma bastante divertida de hacerlo ...
Imperishable Night
Realmente me ayudaste.
Loyea
55

Puedes simplemente git add -f path/to/foo.dll.

.gitignore ignora solo los archivos para el seguimiento habitual y cosas como git add .

Nils Riedemann
fuente
44
Solo para más detalles, -fle dice a git que fuerce la adición de este archivo en el repositorio, ya que podría ignorarlo primero debido a su.gitignore
RPDeshaies
Lo cual es genial si solo tiene un archivo, menos útil si necesita un patrón
Liam
19

Para excluir todo en un directorio, pero algunos subdirectorios, haga lo siguiente:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Fuente: https://gist.github.com/444295

Simon Paarlberg
fuente
15

Simplemente agregue !antes de una regla de exclusión.

Según la página de manual de gitignore :

Los patrones tienen el siguiente formato:

...

  • Un prefijo opcional! que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se volverá a incluir. Si un patrón negado coincide, esto anulará las fuentes de patrones de precedencia inferior.
Robert Munteanu
fuente
5

!foo.dll en .gitignore, o (¡cada vez!) git add -f foo.dll

Tobias Kienzler
fuente
4

Si está trabajando con Visual Studio y su binarchivo .dll se encuentra en una carpeta, deberá agregar una excepción para la carpeta bin en particular, antes de poder agregar la excepción para el archivo .dll. P.ej

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Esto se debe a que el .gitignorearchivo predeterminado de Visual Studio incluye un patrón de ignorar para[Bbin]/

Este patrón está eliminando todas las carpetas bin (y, en consecuencia, su contenido), lo que hace que cualquier intento de incluir el contenido sea redundante (ya que la carpeta en sí ya se ignora).

Pude encontrar por qué mi archivo no se exceptúa al ejecutar

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

desde una ventana de Git Bash. Esto devolvió el [Bbin]/patrón.

DeanOC
fuente
2

La solución depende de la relación entre la regla de ignorar git y la regla de excepción:

  1. Archivos / Archivos en el mismo nivel: use la solución @Skilldrick .
  2. Carpetas / Subcarpetas: use la solución @Matiss Jurgelis .
  3. Archivos / Archivos en diferentes niveles o Archivos / Subcarpetas: puede hacer esto:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Rosberg Linhares
fuente
1

Desde Git 2.7.0 Git tendrá en cuenta las excepciones. De las notas oficiales de lanzamiento:

  • Permita que un "! / Abc / def" posterior anule un "/ abc" anterior que aparece en el mismo archivo .gitignore para que sea más fácil expresar "todo en el directorio / abc se ignora, excepto ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

Erfan
fuente
1
¿esto funciona para alguien? no parece funcionar para mi
Ankur