¿Por qué git ls-files –ignore require exclude patterns?

¿Cuál es la lógica detrás del requisito de usar un patrón de exclusión con el command git ls-files --ignonetworking ?

De git help ls-files :

-i, --ignonetworking

Mostrar solo files ignorados en la salida. Cuando muestre files en el índice, imprima solo los que coincidan con un patrón de exclusión. Al mostrar "otros" files, muestre solo los que coincidan con un patrón de exclusión.

Antes que nada, déjame asegurarme de que no estés confundido, --ignonetworking con --other .

--other es la opción que le daría a la list de files sin seguimiento. Del manual de git-ls-files (énfasis mío):

-o, --others

Mostrar otros files (es decir, sin seguimiento) en la salida

Dicho eso, veamos qué, --ignonetworking . Independientemente de lo que enumere, ya sean files rastreados, no rastreados, modificados, etc., puede excluir algunos files del resultado. Piense en ello como un grep -v libre grep -v hecho automáticamente en la salida. Por ejemplo:

 git ls-files --other --exclude=*.o 

listrá todos los files sin seguimiento que no coincidan con *.o . El patrón exclude no tiene nada que ver con .gitignore . De hecho, .gitignore determina qué .gitignore mientras --exclude filtra la salida después de que se haya hecho la list (o al less ese es el comportamiento observado) 1 .

Ahora --ignonetworking simplemente revierte la salida. Entonces, lo que fue excluido por exclude= se imprimirá en su lugar y lo que no se excluyó se omitirá. Por lo tanto, por ejemplo:

 git ls-files --other --exclude=*.o --ignonetworking 

imprimiría todos los files sin seguimiento que coincidan con *.o .

1 No exactamente así, --exclude solo filtra los files no rastreados, por lo que si está listndo los files rastreados, --exclude no excluiría nada. Sin embargo, con --ignonetworking enumeraría los files que deberían haberse excluido. Es un poco raro.

Conclusión: --ignonetworking básicamente revertiría el patrón de exclusión dado en la línea de command. De forma pnetworkingeterminada, el patrón de exclusión está vacío (lo ve todo), por lo que, si se --ignonetworking sin ningún patrón de exclusión, se omite todo . Esto nunca es útil y es por eso que se requiere un patrón de exclusión para --ignonetworking trabajo.


Como se mencionó --exclude-standard , me gustaría ampliarlo también. --exclude-standard agregaría patrones ignorados (como los escritos en .gitignore ) como patrones de exclusión en la list también. Así que piense en el siguiente command:

 git ls-files --ignonetworking --exclude-standard 

Al principio, este command enumera todos los files rastreados. Luego, dado el command --ignonetworking , solo imprimirá aquellos files que coincidan con el patrón de exclusión. Dado --exclude-standard , se imprimirán efectivamente los files que coincidan con los patrones en .gitignore . PERO esos son los files que mantuvo sin seguimiento. Entonces efectivamente, no verás nada. El único caso en el que verá algo es si está rastreando files que también ha mencionado para ignorarlos en .gitignore .

En otras palabras, si ese command arroja algo, significa que le has dicho a git que ignore ciertos files, pero has violado tus propias reglas y las has agregado al repository de todos modos.


Otros commands interesantes podrían ser:

 git ls-files --other --exclude-standard 

Muestra todos los files sin .gitignore que no especificó en .gitignore . También vería estos files en git status .

 git ls-files --other --ignonetworking --exclude-standard 

Muestra todos los files sin seguimiento que logró ignorar con .gitignore . En otras palabras, (suponiendo que la consulta anterior está vacía, es decir, no hay files sin seguimiento ignorados) esto muestra todos los files que están en el directory actual y que no pertenecen al repository. Esto es útil para search files que no deberían haber sido ignorados y deben colocarse en el repository.