在过去的某个时候,有人删除了我们的master
分支,因为我们使用了newmaster
。但是,origin / HEAD是错误的:
$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master
$ cat .git/refs/remotes/origin/master
cat: .git/refs/remotes/origin/master: No such file or directory
这导致例如git gc
失败。我试着解决这样的情况:
git update-ref --create-reflog -m "Fix HEAD to be newmaster instead of non-existent master" refs/remotes/origin/HEAD refs/remotes/origin/newmaster refs/remotes/origin/master
这与fatal: refs/remotes/origin/master: not a valid old SHA1
失败,因此我似乎无法使用update-ref
修复损坏的引用进行验证。如果我删除旧值,那么我没有输出和零返回代码。但是,没有任何反应:我在origin/HEAD
和git gc
中看到相同的内容仍然会出错:
$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master
$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack
问题:
update-ref
的语法和分支引用是否正确?答案 0 :(得分:1)
我认为这可能被认为是git中的一个错误。特别是git update-ref
应该允许" old" ref是一个字符串,应该直接进行字符串比较。我认为,这里发生的事情是它需要命令行和旧价值" 和要解析为实际提交ID的现有值,当然这些都不是。
我认为你可以做到:
git update-ref --create-reflog \
-m "Fix HEAD to be newmaster instead of non-existent master" \
refs/remotes/origin/HEAD refs/remotes/origin/newmaster
(即,完全取消"预期的旧值"论证),它可能会起作用 - 而不是我实际测试过它。
答案 1 :(得分:1)
这确实是一个错误(在Windows的git中为issues 423),这将在git 2.7(2015年第4季度)中得到缓解
commit 14886b4见commit 8c845cd,Johannes Schindelin (dscho
)(2015年9月28日)
(Junio C Hamano -- gitster
--在commit b05c2f9中合并,2015年10月20日)
pack-objects
:不要被破碎的symrefs分散注意力“
git gc
”用于在符号引用悬空时进行barf(例如,当你克隆它时,曾经是你的上游默认的分支现在已经消失了,你做了“fetch --prune
” )。
Here is a MVCE(Minimal, Complete, and Verifiable example)。
test_expect_failure 'gc removes stale refs/remotes/<name>/HEAD' '
git init remote &&
(
cd remote &&
test_commit initial &&
git clone . ../client &&
git branch -m develop &&
cd ../client &&
git fetch --prune &&
git gc
)
'