7

我有一个关于使用repo切换分支的问题。我知道我可以像这样签出一个分支:

$ repo init ... -b foo
$ repo sync

我的理解是,这将检查清单存储库的 foo 分支,然后按照清单中的描述检查 git 项目。

我也明白我可以像这样切换分支:

$ repo init ... -b bar
$ repo sync -d

我的问题是,我可以在每次不执行 repo init 和 repo sync 的情况下切换分支,这样做有什么影响?

让我用一个例子来说明:

$ repo init ... -b foo
$ repo sync -d
$ repo start foo-mytopic proj1 proj2
 ... make some commits ...
$ repo upload -t
$ repo init ... -b bar
$ repo sync -d
$ repo start bar-topic proj1 proj3
$ repo upload -t
$ cd proj1
$ git checkout foo-mytopic # IS THIS ALLOWED?

我以前试过这个,它似乎可以工作,但这有点奇怪,因为我现在检查了foo清单中的代码,但我当前的清单分支是bar。与清单中描述的分支不同,这意味着什么?

注意:我读过这个,我认为我的问题有所不同。我知道如何切换分支。我对位于与当前清单中描述的分支不同的分支的影响以及这可能如何影响我的工作流程感兴趣。

4

2 回答 2

3

由于没有其他人能够回答这个问题,我做了更多的研究和实验。这是我发现的:

Tl;dr - 某些命令会做一些奇怪的事情。repo sync使用和时要小心repo start。尝试坚持使用简单的 git 命令。repo upload应该管用。

回购文档说回购同步相当于

$ git fetch origin
$ git rebase origin/<BRANCH>

其中 BRANCH 是本地项目目录中当前签出的分支。但是,根据我自己的经验,repo 也会根据当前清单中的内容混淆该分支的上游跟踪信息。

从上面继续这个例子,git checkout foo-mytopic实际上是允许的,并且会表现得适当。repo上传会将更改推送到foo-mytopic正在跟踪的分支 ( foo),但 repo sync 会更改上游跟踪信息。在这种情况下,手动运行git fetch origingit rebase origin/<BRANCH>.

repo syncrepo init 描述的清单(和分支)在运行之前不会再次发挥作用repo start

于 2015-07-02T04:14:28.507 回答
0

我最近遇到了一个条件,人们必须使用repo init -b <branch>来切换分支而不是使用repo forall -c git checkout <branch>

  1. 目前在develop包含项目的最新分支上工作的人A/B/C/D/E/F
  2. 虽然有一天我们需要回到release_1.0只存在项目A/B/CD/E/F尚未创建的分支。

起初,我尝试repo forall -c git checkout release_1.0恢复工作区,release_1.0但失败并说“项目 D/E/F 没有 release_1.0 分支”。

因此,工作空间如下所示repo branches

* develop     | D,E,F
* release_1.0 | A,B,C

D/E/F除非我从我的工作区中手动删除它,否则它肯定会编译失败。

但是如果使用时repo init -b <branch>; repo sync,它可以正常工作:

* release_1.0 | A,B,C

没有更多的D,E,F。它们已由 repo 自动存档。

release_1.0此外,如果您想从to切换developD/E/F因为您从未从develop分支初始化和同步清单) ,您也会遇到类似的情况。

因此,repo forall -c git checkout <branch>当不同分支中的清单之间存在存储库更改(从清单中添加或删除)时,无法处理这种情况,因为与多个存储库进行主题分支切换意味着两件事:

  1. 使您的工作区仅包含该版本所需的存储库(不多也不少)。
  2. 检查他们的分支到你想要的那个。

repo sync 为您完成这两项工作。

于 2021-08-29T16:36:32.177 回答