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

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

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

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

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

2 ответа

Решение

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

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

  • Bazaar: список шаблонов оболочки - с префиксом 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 файл.

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

Другие вопросы по тегам