¿Hay alguna manera de ver por qué git ignora algún archivo (es decir, qué regla de un .gitignore
archivo está haciendo que se ignore)?
Imagine que tengo esto (o un escenario mucho más complejo, con cientos de carpetas y decenas de .gitignore
archivos:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
Si ejecuto git add folder/subfolder/file.txt
git puede quejarme de que se ignore:
The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.
¿Hay alguna manera de saber cuál de todas las posibles .gitignore
tiene una regla para ignorar este archivo y también mostrar la regla? Me gusta:
The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.
O solo:
$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
git check-ignore
pronto (git1.8.5 / 1.9) tendrá una--no-index
opción. Vea mi respuesta a continuaciónGIT_TRACE_EXCLUDE=1 git status
pronto habrá una forma adicional de depurar las.gitignore
reglas. Vea mi respuesta editada a continuaciónRespuestas:
Vea la página del manual para más detalles.
La respuesta original sigue:
Actualmente, git no proporciona nada como esto. Pero después de ver su pregunta, busqué en Google y descubrí que en 2009 esta característica fue solicitada y parcialmente implementada . Después de leer el hilo, me di cuenta de que no sería demasiado trabajo hacerlo correctamente, así que comencé a trabajar en un parche y espero terminarlo en el siguiente día o dos. Actualizaré esta respuesta cuando esté lista.
ACTUALIZACIÓN: Wow, eso fue mucho más difícil de lo que esperaba. Las entrañas del
git
manejo excluyente son bastante crípticas. De todos modos, aquí hay una serie casi completa de confirmaciones que se aplican a lamaster
rama ascendente de hoy . El conjunto de pruebas está completo al 99%, pero aún no he terminado de manejar la--stdin
opción. Espero que lo logre este fin de semana y luego envíe mis parches a la lista de correo de git.Mientras tanto, definitivamente agradecería las pruebas de cualquiera que pueda hacerlo: solo clone de mi
git
tenedor , revise lacheck-ignore
rama y compílelo como de costumbre.ACTUALIZACIÓN 2: ¡ Ya está hecho! La última versión está en github según lo anterior, y he enviado la serie de parches a la lista de correo de git para su revisión por pares. Veamos qué piensan ...
ACTUALIZACIÓN 3: Después de varios meses más de pirateo / revisiones de parches / discusiones / espera, estoy encantado de poder decir que esta característica ahora ha llegado a la
master
sucursal de git y estará disponible en la próxima versión (1.8.2, se espera que sea el 8 Marzo de 2013). Aquí está lacheck-ignore
página del manual . ¡Uf, eso fue mucho más trabajo de lo que esperaba!ACTUALIZACIÓN 4: Si está interesado en la historia completa sobre cómo evolucionó esta respuesta y cómo se implementó la función, consulte el episodio # 32 del podcast GitMinutes .
fuente
git check-ignore
no hago nada.git check-ignore
está presente y trabajando en 1.8.2. Si el comportamiento no es lo que espera, le sugiero que (re) lea la página del manual y, si aún no lo es, envíe un informe de error adecuado en la lista de correo de git. Solo decir que no hace nada no es muy útil. Espero que probablemente lo haya ejecutado en un archivo no ignorado y espere incorrectamente alguna salida (aunque probablemente agregaré soporte para--show-unmatched
el--verbose
modo de salida en el futuro).Actualización git 2.8 (marzo de 2016):
Consulte " Una forma de validar el
.gitignore
archivo "Eso es complementario a lo que se
git check-ignore -v
describe a continuación.Respuesta original: septiembre de 2013 (git 1.8.2, luego 1.8.5+):
git check-ignore
mejora nuevamente en git 1.8.5 / 1.9 (cuarto trimestre de 2013) :Ver commit 8231fa6 de https://github.com/flashydave :
fuente
No puedo encontrar nada en la página de manual, pero aquí hay un script rápido y sucio que verificará su archivo en cada directorio principal para ver si se puede agregar git. Ejecútelo en el directorio que contiene el archivo del problema como:
donde
STOP_DIR
es el directorio de nivel superior del proyecto Git yFILENAME
es el nombre del archivo del problema (sin una ruta). Crea un archivo vacío del mismo nombre en cada nivel de la jerarquía (si no existe) e intentagit add -n
ver si se puede agregar (se limpia después de sí mismo). Produce algo como:La secuencia de comandos:
fuente
Para agregar a la respuesta principal del uso
git check-ignore -v filename
(gracias, por cierto), descubrí que mi archivo .gitignore estaba bloqueando todo porque había una nueva línea después de un comodín, así que tuve:* .sublime-project
como ejemplo. Acabo de quitar la nueva línea, y listo! Fue arreglado.
fuente