Ignorando todos los files en un directory excepto uno en GIT usando el prefijo negate

Quiero ignorar todos los files en un directory excepto un file.

Hago lo siguiente en mi git bash.

$ mkdir dir_to_ignore $ cd dir_to_ignore $ vi file_to_ignore.txt # (I put some content and save the file) $ vi second_file.txt # (Some text and then save the file. I dont wish this file to be ignonetworking) $ cd .. $ vi .gitignore 

Puse el siguiente contenido en el file .gitignore :

 dir_to_ignore/ !dir_to_ignore/second_file.txt 

Pero ahora cuando hago git status , no veo el second_file.txt como un file sin second_file.txt . ¿Por qué está pasando esto?

Parece un tanto extraño ignorar un directory, pero intentar rastrear un file dentro del directory ignorado, porque para rastrear el file, probablemente necesite conocer la ruta completa al file, incluido el directory en el que se encuentra.

Si cambia su file .gitignore a este en su lugar:

 dir_to_ignore/* !second_file.txt 

que ignorará todos los files bajo dir_to_ignore excepto para second_file.txt . Sin embargo, aún necesitará seguir el directory para poder también rastrear el second_file.txt .

Puede lograr lo que desea creando un file .gitignore en el directory dir_to_ignore y poner esto en él

 * !second_file.txt !.gitignore 

(Suponiendo que probablemente también desee controlar la versión del nuevo file .gitignore )

Con una regla como dir_to_ignore/ git ignorará ese directory por completo. Nunca mirará dentro y, por lo tanto, una segunda regla como !dir_to_ignore/second_file.txt nunca coincidirá.

Para get el efecto deseado, en lugar de ignorar el directory en sí, debe ignorar todos los files en el directory, como dir_to_ignore/* . Junto con la segunda regla, git ahora ignorará todos los files, excepto el segundo_file.

Este tipo de situación se dir_to_ignore aún más difícil cuando decides ignorar dir_to_ignore excepto de dir_to_ignore/some/long/path . – La mayoría de las veces es mejor no usar excepciones y simplemente indicar lo que desea ignorar. Si necesita excepciones, debe volver a pensar en la estructura de su proyecto.

Por cierto: tenga en count que una línea como dir_to_ignore/ ignorará todos los directorys con ese nombre a través de todo el proyecto, mientras que /dir_to_ignore/ ignorará solo la que está en el directory actual.