Ещё одна известная распределённая система контроля версий Bazaar. Bazaar — это бесплатная система с открытым исходным кодом, являющаяся частью проекта GNU Project.
Её поведение сильно отличается от Git. Иногда, чтобы сделать то же самое, что и в Git, следует использовать другое ключевое слово, а некоторые такие же ключевые слова имеют другое значение. В частности, управления ветками сильно отличается и может вызвать путаницу, особенно для кого-нибудь из вселенной Git. Тем не менее, с Bazaar репозиторием возможно работать из Git.
Существует много проектов, которые позволяют использовать Git как клиент Bazaar.
Далее, мы будем использовать проект Филипа Контрераса, который можно найти здесь https://github.com/felipec/git-remote-bzr.
Для установки достаточно просто скачать файл git-remote-bzr
и поместить его в один из каталогов вашего $PATH
:
$ wget https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr -O ~/bin/git-remote-bzr
$ chmod +x ~/bin/git-remote-bzr
Так же вам понадобится установленный Bazaar. И всё!
Им просто пользоваться.
Чтобы клонировать Bazaar репозиторий достаточно добавить префикс bzr::
.
Так как Git и Bazaar полностью клонируют репозиторий на ваш компьютер, то можно добавить клон Git к локальному клону Bazaar, но так делать не рекомендуется.
Гораздо проще связать клон Git с центральным хранилищем — тем же местом, с которым связан клон Bazaar.
Предположим, что вы работали с удалённым репозиторием, находящимся по адресу bzr+ssh://developer@mybazaarserver:myproject
.
Чтобы его клонировать, нужно выполнить следующие команды:
$ git clone bzr::bzr+ssh://developer@mybazaarserver:myproject myProject-Git
$ cd myProject-Git
На текущий момент, созданный Git репозиторий использует дисковое пространство не оптимально. Поэтому вы должны очистить и сжать его, особенно если репозиторий большого размера:
$ git gc --aggressive
Bazaar позволяет клонировать только ветки, при этом репозиторий может содержать их несколько, а git-remote-bzr
может клонировать все.
Например, чтобы клонировать ветку выполните:
$ git clone bzr::bzr://bzr.savannah.gnu.org/emacs/trunk emacs-trunk
Чтобы клонировать весь репозиторий, выполните команду:
$ git clone bzr::bzr://bzr.savannah.gnu.org/emacs emacs
Последняя команда клонирует все ветки репозитория emacs; тем не менее, конфигурацией допускается указывать только некоторые из них:
$ git config remote-bzr.branches 'trunk, xwindow'
Некоторые удалённые репозитории не позволяют просматривать список веток, поэтому их перечисление в конфигурации для команды клонирования может оказаться проще в использовании:
$ git init emacs
$ git remote add origin bzr::bzr://bzr.savannah.gnu.org/emacs
$ git config remote-bzr.branches 'trunk, xwindow'
$ git fetch
При работе с проектом под управлением Bazaar вы не должны создавать файл .gitignore
, потому что можете случайно добавить его в отслеживаемые, чем могут возмутиться другие пользователи, работающие с Bazaar.
Решением может выступать создание файла .git/info/exclude
, который может быть как символической ссылкой, так и обычным файлом.
Позже мы рассмотрим пример решения этой проблемы.
Bazaar использует ту же модель игнорирования файлов что и Git, за исключением двух особенностей, не имеющих эквивалента в Git. Полное описание можно найти в документации. Эти два отличия следующие:
-
!!
позволяет игнорировать определённые шаблоны файлов, даже если они указаны со знаком!
-
RE:
в начале строки позволяет указать регулярное выражение Python. Git допускает только шаблоны оболочки.
Следовательно, возможны две ситуации:
-
Если файл
.bzrignore
не содержит специфических префиксов, то можно просто создать символическую ссылку на него:ln -s .bzrignore .git/info/exclude
-
Иначе, нужно создать файл
.git/info/exclude
и адаптировать его в соответствии с.bzrignore
так, чтобы игнорировались те же файлы.
Вне зависимости от ситуации, вам нужно следить за изменениями в .bzrignore
, чтобы файл .git/info/exclude
всегда соответствовал .bzrignore
.
На самом деле, если в файл .bzrignore
будут добавлены изменения в виде одной или нескольких строк с !!
или RE:
вначале, то Git просто не сможет их интерпретировать и вам понадобиться изменить файл .git/info/exclude
так, чтобы игнорировались те же файлы.
Более того, если файл .git/info/exclude
был символической ссылкой, то сначала нужно его удалить, скопировать .bzrignore
в .git/info/exclude
и адаптировать последний.
Однако, будьте осторожны с его созданием, потому что в Git невозможно повторно включить файл в индекс, если исключен родительский каталог этого файла.
Используя обычные команды Git можно получить изменения с удалённого репозитория.
Предположим, что изменения находятся в ветке master
, вы сливаете или перебазируете свою работу относительно ветки origin/master
:
$ git pull --rebase origin
Поскольку Bazaar так же имеет концепцию коммитов слияния, то проблем не возникнет при отправке такого коммита.
Таким образом, вы можете работать в ветке, сливать изменения в master
и отправлять их.
Вы можете создавать ветки, делать коммиты и тестировать изменения как обычно.
Наконец, вы отправляете проделанную работу в репозиторий Bazaar:
$ git push origin master
Существуют ограничения на выполнение операций с удалённым репозиторием. В частности, следующие команды не работают:
-
git push origin :branch-to-delete (Bazaar не понимает удаление ссылок таким способом.)
-
git push origin old:new (будет отправлена 'old')
-
git push --dry-run origin branch (push будет выполнен)