Пытаясь понять BZR хранилище - PullRequest
4 голосов
/ 05 марта 2010

Я пользуюсь Базаром, и мне это нравится.Вообще, я просто создаю разные ветки и управляю ими отдельно.Я только что обнаружил, что все эти ветки могут быть помещены в хранилище.Если я правильно понимаю, это должно сэкономить память и увеличить скорость, так как некоторые общие предки между ветвями являются общими.Q1: Я правильно понимаю?

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

bzr init-repo --trees TestBzrRepo
cd TestBzrRepo
bzr init trunk
mkdir branches
cd branches

bzr branch ../trunk b01-Add-file2-f
echo 'This is file 2' > file2.f
bzr add file2.f
bzr commit -m "Add file 2"

cd ../../trunk
echo 'This is file 1' > file1.f
bzr add file1.f
bzr commit -m "Add file 1"

cd ../branches/b01-Add-file2-f

С этого момента, если я сделаю bzr pull ../../trunk, я получу:

bzr: ERROR: These branches have diverged. Use the missing command to see how.
Use the merge command to reconcile them.

Если я сделаю bzr merge ../../trunk, я получу:

bzr: ERROR: Branches have no common ancestor, and no merge base revision was specified.

bzr conflicts ничего не возвращает, и я все еще не могу вытащить или объединить.

Что здесь происходит?и что мне делать дальше.Пожалуйста, помогите.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 05 марта 2010

Я думаю, что причиной ошибки слияния является то, что вы не создали ревизию до создания второй ветки.bzr qlog TestBzrRepo может помочь разобраться в ситуации.

Попробуйте bzr merge ../../trunk -r 0..-1.

6 голосов
/ 14 сентября 2012

bzr init-repo создает так называемый общий репозиторий . В общем хранилище все ревизии хранятся в каталоге .bzr репозитория, а в каталогах .bzr самих ветвей хранится только метаинформация ветвей, а не сами ревизии. Таким образом, каталоги веток становятся очень легкими, и общие версии ветвей не дублируются.

Допустим, мы создали общий репозиторий и ветви внутри него, например:

bzr init-repo the-project     # create shared repo
bzr init the-project/trunk    # create a branch inside shared repo
cd the-project/trunk          # cd to branch dir
cp -r /path/to/files/* .      # copy the project's files into the branch
bzr add                       # tell bazaar to add everything to version control
bzr commit -m 'added files'   # commit the changes (add files)
bzr branch . ../branch1       # create another branch from the current one
bzr branch . ../branch2       # create another branch from the current one

Тогда каталоги макета будут функционировать так:

the-project/.bzr          -- only revisions are stored here, no branch info
the-project/trunk/.bzr    -- only branch info is stored here, no revisions
the-project/branch1/.bzr  -- only branch info is stored here, no revisions
the-project/branch2/.bzr  -- only branch info is stored here, no revisions

Если бы вы не использовали общий репозиторий, ситуация была бы совсем другой, например:

bzr init trunk                # create a repo
cd trunk                      # cd to repo dir
cp -r /path/to/files/* .      # copy the project's files into the repo
bzr add                       # tell bazaar to add everything to version control
bzr commit -m 'added files'   # commit the changes (add files)
bzr branch . ../branch1       # create another repo from the current one
bzr branch . ../branch2       # create another repo from the current one

В этом случае (без общего репо) каталоги макета будут работать следующим образом:

trunk/.bzr    -- revisions + branch info are stored here
branch1/.bzr  -- revisions + branch info are stored here
branch2/.bzr  -- revisions + branch info are stored here

В этом случае редакции будут продублированы во всех трех ветвях.

bzr pull полезно, если текущая ветвь имеет некоторые ревизии позади другой ветки, так что недостающие ревизии могут быть добавлены простым способом. Если в текущей ветке есть какие-то ревизии, а в другой нет, тогда тянуть не удастся, как в вашем примере. Это совершенно нормально, и решением в такой ситуации является обычное слияние с bzr merge.

bzr merge терпит неудачу в вашем примере, потому что две ветви (транк и другая ветвь) не имеют общих ревизий. Это потому, что в то время, когда вы разветвлялись из ствола, он был совершенно пуст, и в него не было внесено никаких изменений. Две ветви полностью независимы, не имеют абсолютно общих версий.

Все еще возможно объединить несвязанные ветви, как объяснил @bialix в комментарии к bzr merge ../../trunk -r0..-1, но я не думаю, что это было вашим намерением. Бессмысленно ветвиться от ствола, у которого нет ревизий, в реалистичном случае вы будете ветвиться от ветки, у которой есть хотя бы 1 ревизия, и в этом случае вы не получите такой ошибки, и объединение будет работать как ожидалось.

4 голосов
/ 05 марта 2010

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

...