Если вы используете файлы .dummy
только в качестве заполнителей, чтобы убедиться, что вы всегда получаете эти конкретные (почти пустые) каталоги, когда делаете чистую проверку, тогда вам, вероятно, следует просто исключить /var
и использовать git add -f var/.dummy var/log/.dummy
начать явное отслеживание файлов-заполнителей.В результате вы будете игнорировать все, кроме .dummy
файлов, которые вы явно отслеживали.
С другой стороны, если вы планируете расширить иерархию почти пустых каталогов за пределы var/log
, то выможет быть в состоянии использовать немного объяснения.
Правила описаны в gitignore (5) , но иногда трудно понять всеправила и как они взаимодействуют.Важной частью является то, что последнее правило побеждает, и что более поздние правила могут быть эффективными только в том случае, если каталоги, в которых они действуют, еще не полностью игнорируются.Это означает, что если вы игнорировали каталоги, вы должны игнорировать их, прежде чем сможете игнорировать немного их содержимого (при повторном игнорировании остального их содержимого).
Если вы хотите автоматическиигнорируйте все, кроме .dummy
файлов в var
, тогда самый простой способ сделать это - поместить файл .gitignore
в каталог var
вместо того, чтобы делать это на верхнем уровне.Я описал это решение в другом SO ответе .
# var/.gitignore
*
!/.gitignore
!.dummy
!*/
- Игнорировать все в этом каталоге (
var
). - Но не игнорируйте этоодин файл .gitignore (вы можете пропустить это, если вы хотите сделать
git add -f
, чтобы начать отслеживать этот .gitignore
файл). - Кроме того, не игнорируйте файлы
.dummy
на любой глубине в иерархиикорень в этом каталоге (var
). - Кроме того, не игнорируйте никакие каталоги на любой глубине в этом каталоге (
var
).
Без этого правила первое правило будет игнорировать подкаталоги иGit никогда не откроет их для поиска .dummy
файлов.
Последние два шаблона являются «рекурсивными», потому что у них нет косой черты без трейлера (это означает, что *
будет соответствовать слешамв дополнение к другим персонажам).Конечная косая черта заставляет шаблон соответствовать только каталогам.Ведущие и встроенные косые черты эффективно привязывают шаблон к местоположению файла .gitignore
(или к корню хранилища для шаблонов из других исключаемых файлов).Идея состоит в том, что равное *.o
должно совпадать где угодно, но dir/*.o
должно совпадать только с элементами непосредственно под dir
(и мы можем использовать /*.o
для этого последнего эффекта в dir/.gitignore
).
Если вы не можете допустить файл var/.gitinore
, то вы все равно можете делать то, что просили, но вы не можете автоматически «игнорировать» новые .dummy
файлы в любом месте ниже var
без редактирования шаблонов исключения.
# .gitignore at root of repository
/var/*
!/var/.dummy
!/var/log/
/var/log/*
!/var/log/.dummy
- Игнорировать все в каталоге
var
, который является родственным для этого .gitignore
файла. - Но не игнорируйте
var/.dummy
. - Кроме того, не игнорируйте каталог
var/log
. - Но игнорируйте все непосредственно в
var/log
. - Но не игнорируйте
var/log/.dummy
.
Шаблон таков: игнорируйте интересующий каталог (пропустите это в первый раз, так как все по умолчанию «игнорируется»), игнорируйте содержимое каталога, игнорируйте файл .dummy
в нем.Повторите шаблон для каждой более глубокой части иерархии.
Вы можете заменить log
на *
, чтобы он работал для любого каталога непосредственно под var
, но он не будет автоматически работать для каталогов, которые являютсяглубже (например, это будет работать для var/cache/.dummy
, но не для var/log/ssh/.dummy
).Это потому, что мы используем косые черты и привязываем шаблоны.Чтобы вручную заставить его работать, вы должны повторить шаблон, чтобы сгенерировать больше правил исключения для более глубоких частей (игнорировать интересующий каталог, игнорировать содержимое каталога, игнорировать файл).