Файл отслеживания внутри игнорируемого каталога

Некоторое время назад я настроил свой файл .gitignore, чтобы не отслеживать папку my_folder с помощью:

my_folder/

Теперь я хочу отслеживать только указанный файл внутри указанной папки с именем my_file.md. Сделав .gitignore, выполните следующие действия:

my_folder/
!my_folder/my_file.md

и проверки:

git status

файл не отображается как изменение, которое необходимо выполнить.

Что я делаю неправильно?


Добавить

Я попытался изменить свой файл .gitignore на:

my_folder/*
!my_folder/my_file.md

как указано, но файл по-прежнему не отображается как изменение для фиксации после git status. Нужно ли мне reset что-то?


Добавить 2

Попытка добавить файл с помощью git add my_folder/my_file.md возвращает:

The following paths are ignored by one of your .gitignore files:
my_folder/my_file.md
Use -f if you really want to add them.
fatal: no files added

Команда git check-ignore -v my_folder/my_file.md дает:

.gitignore:1:my_folder/*    my_folder/my_file.md

Ответ 1

Чтобы добавить к .gitignore исключить папку, но включить определенную подпапку ", один из хороших способов отладки этих файлов .gitignore - использовать git check-ignore (Git 1.8.4 +):

git check-ignore -v my_folder/my_file.md

Вы увидите, что он по-прежнему игнорируется из-за правила my_folder/.

Это потому, что невозможно повторно включить файл, если родительский каталог этого файла исключен. (*)
(*: если определенные условия не выполняются в git 2.?, см. ниже)

Вот почему игнорирование файлов внутри этой папки (my_folder/*, а не сама папка) позволяет исключить ее.

Конечно, вы можете принудительно добавить игнорируемый файл (git add -f my_folder/my_file.md), но это не относится к этому вопросу.
Дело в том, чтобы объяснить, почему добавление !my_folder/my_file.md в .gitignore не работает с git 2.6 или меньше.


Обратите внимание, что с git 2.9.x/2.10 (в середине 2016?) возможно повторное включение файла, если родительский каталог этого файла исключен если в пути нет добавленного шаблона.

Nguyễn Thái Ngọc Duy (pclouds) пытается добавить эту функцию:

Итак, здесь с git 2.8+ это будет работать:

/my_folder
!my_folder/my_file.md

Ответ 2

Файл не будет отображаться как "изменение, которое необходимо совершить", если оно еще не отслеживается (ранее IOW никогда не добавлялся). Просто добавьте файл с git add, а Git будет отслеживать только файл, но все равно игнорировать папку.

git add -f ignored_folder/my_file

Флаг -f важен, поскольку Git отказывается добавлять файлы из игнорируемых путей.

Ответ 3

когда мне нужны файлы треков, подобные этому, или только структуры каталогов, я добавляю что-то вроде этого в свой .gitignore файл

resources/**/*.*

что означает "игнорировать все файлы с расширением внутри каталога ресурсов, включая подкаталоги".

Затем я помещаю "пустой" файл внутри этих каталогов, которые я хочу отслеживать.

Обратите внимание, что будут отслеживаться только файлы без продолжения, и почему это работает.

с параметром, указанным ниже, теперь вы можете добавить это:

!resources/my_needed_file.md

и это другое решение, которое не включает принудительные файлы, но является только опцией, если вы используете файлы с расширениями.

Я надеюсь, что это поможет кому-то.