22

下面的 shell 代码正确地创建了一个符号引用链

git symbolic-ref "first" "refs/heads/master"
git symbolic-ref "second" "first"
git symbolic-ref "nested/third" "second"
git symbolic-ref "refs/heads/fourth" "nested/third"

以下 shell 代码正确解析了最新创建的对 master 提示的符号引用。

git show-ref "refs/heads/fourth"

官方文档( git-symbolic-ref docgit-show-ref doc)中没有描述这些用例。

但是,以下不起作用

 git check-ref-format --print "first"

所以,我的问题是:

  • refs/heads可以在目录中存储符号引用吗?
  • 链接符号引用可以吗?
  • 由于 check-ref-format 在通过时失败"first",这是否意味着不建议在同一级别创建符号引用"HEAD"?或者也许这个命令不是为了处理符号链接?

我的目的是清楚地了解所支持的内容以及我没有解决任何问题或从错误中受益。

4

3 回答 3

17

我最终将这个问题发布到了 git 开发邮件列表。

Junio C Hamano,主要的 git 维护者(+8700 次提交)为我提供了以下答案。

目前只有两种有效的 symrefs:

  • .git/HEAD,指向 refs/heads/ 层次结构下的某处;

  • .git/refs/remotes/{some remote name}/HEAD,指向 refs/remotes/{the same remote name}/ 层次结构下的某处。

代码可能准备解析递归 symrefs、上述两种以外的 symrefs、指向其他地方的 symrefs,但所有这些都超出了该机制旨在支持的设计范围。代码对它们所做的(没有崩溃)不是设计,而只是一种未定义的行为。

如果我们决定在 1.8.0 中重新组织远程跟踪层次结构,这不会有太大变化。前者根本不会改变,而后者将开始指向 refs/remotes/{the same remote name}/heads 层次结构。

我隐约记得 tg 滥用 symref 机制将 .git/HEAD 指向有趣的位置;它可能仍在这样做,如果是这种情况,我们应该扩展上面的列表以涵盖该用法。

于 2011-02-15T06:49:42.177 回答
3

通常,symrefs 存在于refs/- 至少,这是 git 套件所做的(例如,当使用 git filter-tree 时,你会得到refs/original/...)。一些工具可能会选择忽略没有refs/前缀的引用。

$ git symbolic-ref refs/first refs/heads/master
$ git check-ref-format --print refs/first
refs/first
于 2011-02-13T20:37:36.110 回答
2

希望符号链接可以更透明地使用并且也可以被推送。它们可以成为新工作流程的强大工具。目前,如果我创建一个符号链接然后推送是服务器将具有哈希而不是相应引用中的链接。

于 2014-05-10T03:38:17.207 回答