Можно ли использовать тот же файл игнорирования для Git, Mercurial и Bazaar?

Git, Mercurial и Bazaar, похоже, имеют одинаковые форматы для своего файла игнорирования (.gitignore, .hgignore, .bzrignore [см. также bzr patterns]).

Чтобы улучшить синхронизацию глобальных файлов игнорирования, было бы безопасно использовать их как фактический файл и просто символизировать другие два в этом файле? Другими словами, существует ли какая-либо опасность сделать мой $HOME/.gitignore канонический файл игнорирования и сделать

ln -s $HOME/.gitignore $HOME/.hgignore
ln -s $HOME/.gitignore $HOME/.bazaar/ignore

или есть какая-то тонкая разница между ними, которая укусила бы меня в какой-то момент?

Ответ 1

Синтаксис, используемый в файлах игнорирования, отличается от системы к системе:

  • Список регулярных выражений Mercurial: может быть изменен с помощью строки syntax: glob.

  • Базар: список шаблонов оболочки оболочки - префикс с RE: для соответствия регулярному выражению.

  • Git: список шаблонов оболочки оболочки.

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

Я тестировал его с этим файлом:

syntax: glob
.bzr
.git
.hg
*.o
*~

и, похоже, он работает по всем трем инструментам. Чтобы проверить его, я создал это дерево каталогов:

$ tree
.
|-- foo.c
|-- foo.c.~1~
|-- foo.h
|-- foo.o
`-- src
    |-- bar.c
    |-- bar.c.~1~
    `-- bar.o

и выполнил команду статуса для каждого инструмента:

$ for tool in hg git bzr; do echo "== $tool status =="; $tool status; done
== hg status ==
? foo.c
? foo.h
? src/bar.c
== git status ==
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo.c
#       foo.h
#       src/
nothing added to commit but untracked files present (use "git add" to track)
== bzr status ==
unknown:
  foo.c
  foo.h
  src/

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

Технически, Git и Bazaar теперь будут игнорировать файл с именем syntax: glob, но если вы не планируете создавать файл с этим странным именем, это не имеет значения. Наконец, обратите внимание, что Mercurial по умолчанию не читает файл $HOME/.hgignore. Но вы можете прочитать его, добавив

[ui]
ignore.my-default = ~/.hgignore

в ваш $HOME/.hgrc файл.

Ответ 2

Синтаксис не менее Git и Mercurial различается (шаблоны glob и regex в hg), не забудьте также наборы файлов в hg,! условия в bzr