试图了解BZR存储库

时间:2010-03-05 15:49:14

标签: bazaar

我使用Bazaar而我喜欢它。通常,我只是创建不同的分支并分别管理它们。我刚刚发现所有这些分支都可以放入存储库。如果我理解正确,这应该节省内存并提高速度,因为分支之间的一些共同祖先是共享的。 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 个答案:

答案 0 :(得分:6)

我认为合并错误的原因是您在创建第二个分支之前没有创建修订。 bzr qlog TestBzrRepo可能有助于理解这种情况。

尝试bzr merge ../../trunk -r 0..-1

答案 1 :(得分:6)

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 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

在这种情况下(没有共享仓库),布局目录的功能如下:

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

在这种情况下,修订将在所有3个分支中重复。

如果当前分支是另一个分支后面的一些修订,则

bzr pull非常有用,因此可以以简单的方式附加缺少的修订。如果当前分支有一些另一个没有的修订,则拉动失败,如示例所示。这是完全正常的,在这种情况下的解决方案是与bzr merge进行正常合并。

bzr merge在您的示例中失败,因为两个分支(主干和另一个分支)没有共同的修订版。这是因为当你从trunk分支时,它完全是空的,没有对它进行修改。这两个分支是完全独立的,绝对没有共同的修改。

仍然可以将不相关的分支组合为@bialix在评论{/ 1}}中解释,但我不认为这是你的意图。从没有修订的主干分支是没有意义的,在实际用例中,您将从具有至少1个修订的分支分支,在这种情况下,您将不会得到此类错误,并且合并将按预期工作。

答案 2 :(得分:4)

是的,存储库允许分支机构共享存储以获取常见历史记录。如果您有许多具有相关历史记录的分支,这可能是一个很大的节省。