为什么 Google repo 同步到无头状态

Why does Google repo sync into headless state

因此,在 manifest.xml 中,您为项目指定了修订版,比如项目 foo 的修订版主。那你

repo sync

并下载项目 foo 的 master 分支。但它实际上并没有检查那个分支。相反,它会让你处于无头状态,不知何故从 master 开始......?如果我打算实际处理同步项目,这似乎相当麻烦。

我知道它可以 "fixed" 很容易,但由于它看起来如此违反直觉,我猜他们有一个很好的理由让你默认处于无头状态。我想在偏离之前了解预期的工作流程,所以有人可以解释一下吗?

"A headless state" 在 Git 中被称为 detached HEAD

在清单中(例如,.repo/manifest.xml)我们可以看到每个项目都有 revision。它可以是提交 (40a264de45eb035c67aa32d73c767ed7d9378ba2)、标记 (refs/tags/v1.0)、分支 (refs/heads/mastermaster) 或任何有效的 git 引用 (refs/changes/11/22211/1).

repo sync 将裸仓库克隆到 $coderoot/.repo/projects/$coderoot/.repo/project-objects,在裸仓库中调用 git rev-parse 以获取 revision 的提交,然后 git checkout$coderoot/ 下的回购中提交,这总是导致分离的 HEAD。参见 project.py

请注意,这两个命令在两个存储库中被调用。假设在$coderoot/.repo/project/foo.git中有一个分支master,在$coderoot/foo/中也有一个分支master。两个 masters 可能指向不同的提交,请记住它允许在现有目录中 运行 repo syncgit checkout master in $coderoot/foo/ 会提取错误代码。分支名称不可信,提交是。这就是为什么 repo sync 总是检查提交而不是分支。

下载一大堆回购的能力很棒。但是我发现当前的行为非常有限。想象一个有大量相关 repos 的 repo 森林,每个都有自己的版本分支名称:master-1、master-2 等

现在在 运行 回购同步后,您拥有 HEAD 分离案例中的所有回购。是否有一个选项可以检查清单文件中指定的分支,即检查具有相同名称的现有分支是否正在跟踪远程分支,或者只是由其创建的本地分支,即不跟踪远程分支。

e.g.1: repo-1 master 分支是master-1,有跟踪分支master-1 例如2:repo-2 master分支是master-2,不跟踪远程分支的本地分支master-2

在上面的示例脚本中,当 repo-2 处于 HEAD 分离状态时,将在 master-1 分支中显示 repo-1。