在 Android Repo 项目中切换 Git 分支

Posted

技术标签:

【中文标题】在 Android Repo 项目中切换 Git 分支【英文标题】:Switching Git branches inside an Android Repo project 【发布时间】:2015-08-25 21:41:59 【问题描述】:

我有一个关于使用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 清单中的代码,但我当前的清单分支是 酒吧。与清单中描述的分支不同,这意味着什么?

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

【问题讨论】:

我想我的问题最终归结为:在特定 git 存储库中与在 repo 清单中为该 git 存储库指定的分支不同(上游)分支上的含义是什么文件? 【参考方案1】:

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

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

repo documentation 表示 repo sync 相当于

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

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

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

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

【讨论】:

【参考方案2】:

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

    目前在最新的develop 分支上工作的人包含项目A/B/C/D/E/F 虽然有一天我们需要回到 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 &lt;branch&gt;; repo sync的时候,效果很好:

* release_1.0 | A,B,C

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

如果你想从release_1.0 切换到develop,也会遇到类似的情况(D/E/F 是缺失的,因为你从未从develop 分支初始化和同步清单)。

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

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

repo sync 为你做这两件事。

【讨论】:

以上是关于在 Android Repo 项目中切换 Git 分支的主要内容,如果未能解决你的问题,请参考以下文章

切换到虚拟环境时,Git repo 在 PyCharm 的集成 bash 终端中消失

Android 代码开发工作流

git入门(6.repo)

在 Visual Studio 2015 git repo 中切换分支时发生错误,无法 rmdir 访问被拒绝

repo的一些用法

Android编译环境配置(Ubuntu 14.04)