所以我有一些 git 存储库:
git init
echo "Recipes" > README
git add README
然后我创建了一个名为“beef”的分支来存储我所有的牛排食谱:
git checkout -b beef
一段时间过去了,然后有人做出了提交:
GIT_AUTHOR_DATE='Tue Jan 1 00:00:00 2019 -0400' \
GIT_COMMITTER_DATE='Tue Jan 1 00:00:00 2019 -0400' \
GIT_COMMITTER_NAME='Chef' \
GIT_COMMITTER_EMAIL='<chef@localhost>' \
GIT_AUTHOR_NAME='Chef' \
GIT_AUTHOR_EMAIL='<chef@localhost>' \
git commit -m "New recipe:00100011000001010000000010100000"
git checkout -b master
呃哦...提交哈希以 beef
开头! [1] 现在,每次我想切换到我的牛肉分支时,我都会收到这条烦人的消息:warning: refname 'beef' is ambiguous.
更糟糕的是,如果我在其他地方克隆存储库并尝试第一次检查牛肉分支,我最终会在牛肉提交上得到一个分离的头!当然,我可以通过 git checkout --track origin/beef
而不是仅仅 git checkout beef
来解决这个问题,但现在我需要告诉所有使用我的项目的人特殊解决方法。
所以,长话短说,我的问题是:我有一个带有 git commit 前缀的分支。当我说 beef
时,我如何一劳永逸地告诉 git 我总是想引用分支,而不是提交?理想情况下,这应该适用于下载存储库的任何人,但即使是只在本地工作的修复也很好。
限制:
- 我无法重命名/删除分支。其他人使用这个项目,他们希望分支在那里并命名为 beef。
- 我无法修改/删除有问题的提交,因为它已被推送到共享仓库中的 master。
- 我真的不想要像 this question 中提到的那样的临时解决方法每次使用牛肉分支时我都必须输入,我想要一种方法来一劳永逸地解决这个问题。
[1] 我花了太长时间试图让那个提交有一个以 beef 开头的可重现的散列......但是,是的,这是从我在真实存储库中看到的一个例子派生的(分支名称被更改以保护无辜者)。
最佳答案
目前似乎没有简单的解决办法。
我已经检查了设置 core.abbrev
到更高的数字(例如 8 或 10 或...超过您的分支名称长度)不会阻止警告。
可能是 Git 2.23 命令 git switch
将缓解这个问题,因为它只切换 分支 (而 git restore
将恢复 tree content ,因此仍然会受到影响,因为树可以被提交或引用一个分支)
我刚刚对其进行了测试:该警告仍然存在,但至少,您只能切换到分支,因此不会造成混淆。
注意:正如我在“How would Git handle a SHA-1 collision on a blob?”中提到的,您可以使用bradfitz/gitbrute
强制提交特定的 SHA1 前缀。
关于git - 永久修复分支名称和提交哈希之间的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504500/