четверг, 26 марта 2009 г.

Работа с ветками: push, pull, merge (Часть 2)

Продолжаем начатую тему работы с ветками. Рассмотрим практическое применение команд push, pull, merge на двух примерах: синхронизация веток между несколькими компьютерами (одиночная работа), совместная работа над одним проектом в небольшом коллективе.

Сценарий №1

Петр работает над своим проектом FuzzyCoding на нескольких компьютерах (например, на домашнем и на рабочем). Перед тем как уйти с одного рабочего места на другое Петр фиксирует сделанные изменения, чтобы можно было продолжить работу на другом компьютере. Петр использует синхронизацию своих веток на разных компьютерах при помощи USB-flash диска. Когда он заканчивает работу, то  копирует новые ревизии из локальной ветки на флеш-диск командой bzr push. Придя на другое рабочее место синхронизирует локальную ветку, копируя новые ревизии с флеш-диска командой bzr pull.

Рассмотрим этот сценарий более детально.

Подготовка USB-flash диска

Петр уже создал новую ветку на своем компьютере и работает в ней некоторое время. Для переноса своей ветки на другой компьютер он решил использовать USB-диск. Петр может просто использовать команду bzr push в своей рабочей ветке, чтобы передать ревизии и рабочие файлы на USB-диск. Базар полностью поддерживает такую работу.

Однако, имеет смысл сделать некоторые подготовительные действия на USB-диске. Дело в том, что команда push не только копирует новые ревизии в другую ветку, но еще и обновляет рабочие файлы в другой ветке в том случае, если ветка локальная. Поскольку подключенный USB-диск практически всегда является локальным диском, то bzr будет стараться создать и обновить ваши рабочие файлы. В то же время для синхронизации веток вам совсем не требуется переносить и рабочие файлы (поскольку они присутствуют в истории и могут быть легко восстановлены). Поэтому с практической точки зрения необходимо исключить рабочие файлы с USB-диска и синхронизировать только историю.

Для одной ветки это можно сделать так: создать новую ветку и удалить дерево рабочих файлов.

E:\USB_sync>bzr init
Created a standalone tree (format: pack-0.92)

E:\USB_sync>bzr remove-tree

Здесь мы создали новую ветку командой init в каталоге E:\USB_sync (E: это наш USB-диск при использовании Windows, на Linux флеш-диски монтируются в /mnt/flash или другое место). А затем удалили рабочее дерево командой remove-tree.

Другим вариантом является создание общего репозитория для веток на USB-диске, новые ветки в котором автоматически будут создаваться без рабочих файлов:

E:\>bzr init-repo --no-trees USB_repo
Shared repository (format: pack-0.92)
Location:
  shared repository: USB_repo

Опция командной строки --no-trees указывает, что по умолчанию для всех веток в этом репозитории рабочие файлы создаваться не будут.

Копирование новых ревизий на USB-диск

Для отправки новых ревизий на USB-диск Петр использует команду push:

C:\work\bzr-day\FuzzyCode>bzr push E:\USB_sync
Pushed up to revision 3.

Создание копии ветки на другом компьютере

Придя на другое рабочее место со своим USB-диском Петр создает копию ветки для работы:

C:\work\bzr-day>bzr branch E:\USB_sync FuzzyCode
Branched 3 revision(s).

Теперь он может продолжать работу со своей веткой FuzzyCode. По окончании работы Петр снова отправляет новые ревизии на USB-диск командой push.

Синхронизация рабочей ветки с USB-диском

Для получения новых ревизий с USB-диска в свою рабочую ветку Петр использует команду pull:

C:\work\bzr-day\FuzzyCode>bzr pull E:\USB_sync
All changes applied successfully.
Now on revision 4.

Рабочая ветка успешно обновлена, можно продолжать работу.

Иногда ветки могут разойтись

Если же Петр забыл синхронизировать рабочую ветку с USB-диском и зафиксировал новые изменения, то при попытке сделать push или pull он получит сообщение, что ветки "разошлись". В этом случае Петр должен объединить ветки командой merge:

C:\work\bzr-day\FuzzyCode>bzr merge E:\USB_sync
+N  dir/
+N  foo.txt
All changes applied successfully.

C:\work\bzr-day\FuzzyCode>bzr commit -m "Объединение рабочей ветки с копией ветки на USB-диске"
Committing to: C:/work/bzr-day/FuzzyCode/
added dir
added foo.txt
Committed revision 5.

После этого команда push позволит синхронизировать копию на USB-диске с рабочей веткой.

Мы рассмотрели простой пример синхронизации веток между несколькими компьютерами. В качестве промежуточной ветки также можно использовать и некоторый общедоступный сервер, например SFTP/FTP.

В следующей части мы рассмотрим сценарий совместной работы над проектом в небольшом коллективе.

Комментариев нет:

Отправить комментарий