Forzar agregar a pesar del archivo .gitignore


413

¿Hay alguna forma de forzar la gitadición de un archivo a pesar del .gitignorearchivo?


44
Una mejor pregunta puede ser: ¿por qué querrías hacer eso? Si desea realizar un seguimiento de un archivo, anótelo (prefija su patrón en el .gitignorearchivo con !, por ejemplo !dont/ignore/this/file).
Ohad Schneider

66
@OhadSchneider Esto es útil si obliga a comprometer los archivos de compilación a otra rama. Algunos proyectos hacen esto, como StrongLoop para implementaciones seguras
Deminetix

55
@OhadSchneider Para nosotros, es más porque la mayoría de los desarrolladores instalan git con Visual Studio 2015, que agrega un gitignore global a la carpeta del usuario. Esto excluye archivos como * .dll y * .exe. Eso es excelente para nuestros nuevos proyectos que solo usan paquetes nuget que se recuperan durante la compilación, pero para un pequeño número de proyectos más antiguos, todavía usamos dll a los que se hace referencia manualmente en la solución. Para esos proyectos, nos gustaría incluirlos manualmente, en lugar de decirle a cada desarrollador que comente los archivos * .dll y * .exe en el gitignore global.
Nullius

44
@Nullius ¿No puedes ignorarlos en un nivel superior .gitignore(por ejemplo, agregar uno .gitignoreen la misma carpeta que el dll, o uno de arriba, o algo así)?
Ohad Schneider

Respuestas:


570

Ver man git-add:

   -f, --force
       Allow adding otherwise ignored files.

Así que ejecuta esto

git add --force my/ignore/file.foo

11
Uhm eso no funciona, en el estado de git el archivo todavía no se muestra
Mark

55
Bueno, lo probé para asegurarme de que realmente funciona y funciona. ¿Puedes describir tu entorno (SO, versión git ...)? Esto es lo que básicamente he hecho: echo "/foo" >> .gitignore; echo "bar" > foo; git add foo # should throw an error; git add -p foo # works(no puedo pegar nuevas líneas en el comentario, ejecutar los comandos 1 por 1
Daniel Böhmer

44
Lo mismo me sucedió, anteriormente había ejecutado git update-index --asume-inalterado en mis archivos. Tuve que deshacerlo con --no-asumir-sin cambios y funcionó
Jako

44
Esto solo funciona para mí usando comodines, usando git 1.9.5 en Windows, incluso después de intentar --no - asumir-sin cambios. "git add - f <nombre de archivo>" no hace nada, pero "git add -f *" funciona. Usar TortoiseGit también funciona.
mhenry1384

@ mhenry1384 La razón por la que funciona solo con comodines en Windows puede deberse a cómo se usa el separador de ruta. Para mí, la barra "/" funciona, pero la barra invertida "\" no. El hecho de que cmd / PowerShell convierta "/" a "\" para nosotros hace que sea más fácil encontrar esto.
ohw

19

A pesar de la solución de trabajo de Daniel Böhmer, Ohad Schneider ofreció una mejor solución en un comentario:

Si el archivo generalmente se ignora y fuerza la adición, puede volver a ignorarse accidentalmente en el futuro (como cuando se elimina el archivo, se realiza una confirmación y se vuelve a crear el archivo.

Simplemente debe ignorarlo en el archivo .gitignore de esa manera: Unignore subdirectorios de directorios ignorados en Git


44
Esto es correcto. Estaba usando la opción --force para archivos de datos pequeños, y luego reorganicé un poco la estructura de carpetas y golpeé todos los archivos con seguimiento forzado. SIN EMBARGO: en .gitignoreuso !specific-file-name.txtsin la jerarquía de carpetas, de esta manera el seguimiento seguirá el archivo alrededor del repositorio.
Merlin

Depende del escenario, por ejemplo, en algún momento desea excluir "1.txt" en todas las carpetas, y en algún momento "folder1 / *. Txt"
AS

15
Esa no es una solución "mejor". Es una solución a un problema diferente.
aij

2

Otra forma de lograrlo sería editar temporalmente el archivo gitignore, agregar el archivo y luego revertir el gitignore. Un poco hacky me siento


10
Estoy de acuerdo, esto no es lo que quieres hacer.
Merlin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.