Файл отслеживания внутри игнорируемого каталога
Некоторое время назад я настроил свой файл .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
и это другое решение, которое не включает принудительные файлы, но является только опцией, если вы используете файлы с расширениями.
Я надеюсь, что это поможет кому-то.