3

现在,我不知道一个 ref 是否只有在 refs/heads 内部时才被认为是一个分支,实际上这个问题之前的标题是如何检查存储在 refs/heads 之外的分支?. 所以我不确定存储在 refs/heads 之外的 refs 是否仍然可以称为“正确的分支”,但重点是:

假设我有一个提交的引用,就像所有正常的分支一样,但存储在 refs/heads 之外;例如,使用 git-notes 添加的注释以这种方式存储,默认情况下在 ref refs/notes/commits 中。

是否仍然可以以某种方式将其签出,就好像它是一个正常的分支(进行分离头签出),然后使用其他 git 命令(rebase、cherry-pick 等)进行处理,好像它是一个普通的 refs/heads 分支?

我知道正常git checkout只会将其作为提交检出,将存储库置于分离头状态。

我确实找到了一种似乎可行的方法,即:

git symbolic-ref HEAD refs/MyUnusualRefPath/MyUnusualRef
git checkout -f HEAD

显然,我这次能够做我必须做的事情,但我想知道总的来说,这是否是受支持的,或受支持的,或者至少“现在它运作良好”,操作,以及如果我将来可以依靠它并建议其他人使用它。

我试图查看 git checkout 的源代码,但过了一段时间很明显,我最好在 Stack Overflow 中发布一个问题(当然,我之前在网上搜索过)。
事后看来,研究(整个)git 源代码可能需要更少的时间。

我确实需要这个东西来解决在存储库之间共享(可怕的实现/记录的)注释的问题,但不要专注于这个,只回答我上面的问题,或者忽略它,让其他了解的人它回答。

4

1 回答 1

2

正确的分支(意味着不是分离的 HEAD)是存储在 HEAD 直接引用的 refname 中的提交。
这意味着HEAD 是对 refname 的符号引用(它又包含实际的提交)。另请参阅“ HEAD:当前提交

这就是为什么git symbolic-ref HEAD refs/MyUnusualRefPath/MyUnusualRef在这里工作。

您可以将该 ref 存储在 中的任何位置refs/但是

同样默认情况下,我们按“refname”排序。
由于 'HEAD' 在 'refs/...' 之前按字母顺序排列,我们最终得到一个由 'HEAD' ref 组成的数组,然后是本地分支,最后是远程跟踪分支。

branch.c代码似乎只过滤refs/heads/...refs/remotes/...


注意:只有 Git 2.11+ 会检测并抵制与 GIT_DIR/refs 的符号链接,这会导致名称解析永远循环。

请参阅Jeff King ( )的提交 e8c42cb提交 3f7bd76(2016 年 10 月 6 日) 。(由Junio C Hamano 合并 -- --提交 f7300cb中,2016 年 10 月 17 日)peff
gitster

于 2015-10-23T11:38:40.583 回答