Как я могу получить эквивалент регулярных выражений .hgignore ^ var / (?! \ Log | .dummy) и ^ var / log / (?! \. Dummy) в .gitignore? - PullRequest
4 голосов
/ 20 марта 2011

Я конвертирую свой репозиторий Mercurial в Git. Часть файловой системы выглядит так:

|-- .gitignore
|-- .hgignore
`-- var
    |-- .dummy
    |-- asdf
    `-- log
        |-- .dummy
        `-- asdf

Мой файл .hgignore использует регулярные выражения. Часть моего файла .hgignore выглядит следующим образом:

^var/(?!\log|.dummy)
^var/log/(?!\.dummy)

Я хочу отслеживать файлы .dummy, но не asdf. hg status возвращает:

? var/.dummy
? var/log/.dummy

Как я могу получить такой же эффект в .gitignore? Я пробовал следующее:

/var/**/*
!/var/.dummy
!/var/log/.dummy

Но это не будет игнорировать var/asdf по желанию. Как я могу отслеживать var/.dummy и var/log/.dummy и игнорировать var/asdf и var/log/asdf?

Ответы [ 2 ]

10 голосов
/ 20 марта 2011

Если вы используете файлы .dummy только в качестве заполнителей, чтобы убедиться, что вы всегда получаете эти конкретные (почти пустые) каталоги, когда делаете чистую проверку, тогда вам, вероятно, следует просто исключить /var и использовать git add -f var/.dummy var/log/.dummyначать явное отслеживание файлов-заполнителей.В результате вы будете игнорировать все, кроме .dummy файлов, которые вы явно отслеживали.

С другой стороны, если вы планируете расширить иерархию почти пустых каталогов за пределы var/log, то выможет быть в состоянии использовать немного объяснения.

Правила описаны в gitignore (5) , но иногда трудно понять всеправила и как они взаимодействуют.Важной частью является то, что последнее правило побеждает, и что более поздние правила могут быть эффективными только в том случае, если каталоги, в которых они действуют, еще не полностью игнорируются.Это означает, что если вы игнорировали каталоги, вы должны игнорировать их, прежде чем сможете игнорировать немного их содержимого (при повторном игнорировании остального их содержимого).


Если вы хотите автоматическиигнорируйте все, кроме .dummy файлов в var, тогда самый простой способ сделать это - поместить файл .gitignore в каталог var вместо того, чтобы делать это на верхнем уровне.Я описал это решение в другом SO ответе .

# var/.gitignore
*
!/.gitignore
!.dummy
!*/
  1. Игнорировать все в этом каталоге (var).
  2. Но не игнорируйте этоодин файл .gitignore (вы можете пропустить это, если вы хотите сделать git add -f, чтобы начать отслеживать этот .gitignore файл).
  3. Кроме того, не игнорируйте файлы .dummy на любой глубине в иерархиикорень в этом каталоге (var).
  4. Кроме того, не игнорируйте никакие каталоги на любой глубине в этом каталоге (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
  1. Игнорировать все в каталоге var, который является родственным для этого .gitignore файла.
  2. Но не игнорируйте var/.dummy.
  3. Кроме того, не игнорируйте каталог var/log.
  4. Но игнорируйте все непосредственно в var/log.
  5. Но не игнорируйте var/log/.dummy.

Шаблон таков: игнорируйте интересующий каталог (пропустите это в первый раз, так как все по умолчанию «игнорируется»), игнорируйте содержимое каталога, игнорируйте файл .dummy в нем.Повторите шаблон для каждой более глубокой части иерархии.

Вы можете заменить log на *, чтобы он работал для любого каталога непосредственно под var, но он не будет автоматически работать для каталогов, которые являютсяглубже (например, это будет работать для var/cache/.dummy, но не для var/log/ssh/.dummy).Это потому, что мы используем косые черты и привязываем шаблоны.Чтобы вручную заставить его работать, вы должны повторить шаблон, чтобы сгенерировать больше правил исключения для более глубоких частей (игнорировать интересующий каталог, игнорировать содержимое каталога, игнорировать файл).

2 голосов
/ 20 марта 2011

Вам не нужно исключать .dummy с помощью регулярных выражений. Просто игнорируйте все и добавьте вручную все ваши .dummy.

Игнорировать влияет только на результат команды статуса.

...