Git符号引用的推荐使用方法是什么?

25
以下的 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" 同级别创建符号引用?或者,这个命令不打算处理符号链接?

我的目的是清楚地了解支持什么,确保我没有规避任何问题或者受益于一个 bug。


在使用过程中,当HEAD指向一个带注释的标签时,我发现git-commit会导致段错误。 - Josh Lee
1
@jleedev:这不是一个错误。这是一项功能,以防止用户做出恶意行为... :-) - nulltoken
3个回答

20

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

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

现在只有两种有效的符号链接(symrefs):

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

  • .git / refs / remotes / {一些远程名称} / HEAD,指向refs / remotes / {相同的远程名称} /层次结构下的某个位置。

代码可能准备好解决递归symrefs,不是上述两种类型的symrefs,指向其他地方的symrefs,但它们都超出了机制旨在支持的设计范围。代码对它们所做的事情(而不会崩溃)并不是设计,而只是未定义的行为。

如果我们决定在1.8.0中重新组织远程跟踪层次结构,这不会有太大改变。前者不会改变,后者将开始指向refs/remotes/{相同的远程名称}/heads层次结构。

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


邮件列表线程链接:http://git.661346.n2.nabble.com/What-s-the-definition-of-a-valid-Git-symbolic-reference-tt6025154.html#a6026446 - Magicmaaan
很有趣,我们现在的版本大约是2.28,但远程层次结构似乎没有被改变。也许这个想法已经被放弃了。 - Martini Bianco

3

通常,符号引用存储在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

那么,你的理解是我正在从一个漏洞中受益?你了解symref链接吗?它是否有效,或者我也在利用一个“未受保护”的用法? - nulltoken
通常情况下,除了每个人都有的一个symref HEAD之外。 - Cascabel
1
Refs 可能存在于 .git/refs/ 之外 - 您可以在它们上调用 git log - 例如 FETCH_HEAD、HEAD、ORIG_HEAD、RENAMED-REF。但是 gitk 不会显示它们,除了 HEAD。 - user611775
Git源代码明确允许链接的符号引用,最多可以达到5层(包括HEAD在内的4层)。 - iCodeSometime

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接