git update-ref似乎什么都不做

时间:2015-10-01 07:21:43

标签: git

在过去的某个时候,有人删除了我们的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/HEADgit 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的语法和分支引用是否正确?
  • 是验证失败还是未能在git中执行错误?

2 个答案:

答案 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 14886b4commit 8c845cdJohannes 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 MVCEMinimal, 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
    )
'