【问题标题】:Fatal error after GitHub automatic mergeGitHub自动合并后出现致命错误
【发布时间】:2012-04-23 05:37:40
【问题描述】:

我在 GitHub 上有一个存储库,位于 here。我为某人创建了一个工作分支,他们分叉了 repo,对工作分支进行了一些更改并提交了一个拉取请求。

我尝试了更改,一切都很好,由于 GitHub 提供自动合并拉取请求,我继续点击绿色的大“合并拉取请求”按钮。除了对工作分支的更改应用于我可以忍受的主分支之外,一切都很好。

现在的问题是我或其他任何人都无法获取存储库。我收到此错误:

dp@dpub:/tmp/gh$ git clone git://github.com/dapphp/securimage.git
Initialized empty Git repository in /tmp/gh/securimage/.git/
remote: Counting objects: 333, done.
remote: Compressing objects: 100% (269/269), done.
remote: Total 333 (delta 91), reused 297 (delta 55)
Receiving objects: 100% (333/333), 3.91 MiB | 2.78 MiB/s, done.
Resolving deltas: 100% (91/91), done.
error: refs/remotes/origin/master does not point to a valid object!
error: Trying to write ref refs/heads/master with nonexistant object 31d684d383913c4cf1a0d5ff0691c2c163284a35
fatal: Cannot update the ref 'HEAD'.

这将导致不会创建目录或下载任何工作文件。我已经到处寻找可能的方法来解决这个问题,但大多数人都在谈论向 git repo 发出命令,这是我无法做到的,因为我一开始就无法获得 repo 的副本。

我发现我仍然可以使用以下方式克隆远程分支:git clone -b audiofixes git://github.com/dapphp/securimage.git 但我仍然收到有关错误引用的错误,并且我无法找出可以运行的任何命令来解决问题。如有必要,我愿意撤消更改。

如果有帮助,一旦我克隆了一个不同的分支,这里是 git branch -a 的输出:

* audiofixes
  remotes/origin/2.0.2
  remotes/origin/3.0
  remotes/origin/HEAD -> origin/master
  remotes/origin/audiofixes
  remotes/origin/securimage_flash

在这一点上,我真的不知道我可以做什么(如果有的话)来修复存储库的状态。

感谢您的任何建议。

编辑:按要求输出一些命令。

$ ls .git/refs/remotes/origin
HEAD

$ ls .git/objects
info/  pack/
# info is empty, pack has pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.idx and pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.pack

$ cat .git/refs/remotes/origin/master
cat: .git/refs/remotes/origin/master: No such file or directory

$ cat .git/refs/remotes/origin/HEAD 
ref: refs/remotes/origin/master

【问题讨论】:

  • 这听起来像是一个你应该联系 GitHub 的问题。
  • @Amber 我昨晚发送了一个支持请求,但还没有回复(不是我期待这么快),但我想我会在等待时与这里的任何 Git 向导一起试试运气(我)耐心地。
  • 我很好奇:看看能不能粘贴ls .git/refs/remotes/origincat .git/refs/remotes/origin/masterls .git/objects的结果
  • @Thr4wn 我继续并将您请求的命令的输出添加到帖子中,谢谢。
  • 你现在有正确的方法(让某人在 github 上修复与他们的回购refs/heads/master 的想法相关的 SHA1),但现在我很好奇到底出了什么问题。基本上有两种可能性:不知何故,新的提交进入了 repo,给你留下了分支提示31d684d...,然后写到了refs/heads/master,然后提交神奇地消失了;或者,实际的新分支提示是别的东西,但 refs/heads/master 是用 31d684d... 编写的。两者都不应该发生。

标签: git github git-fetch


【解决方案1】:

新:

显然 1) github 不提供 ssh 访问权限 :(,以及 2) 无法通过 git 协议在不同机器之间共享 reflog。

所以...您显然已经创建了一张票,但您不一定需要它们来修复存储库。您只需要让他们(因为他们有特权访问)在服务器的存储库上运行git reflog master,然后粘贴结果供您查看。在该文件中,查找 master 以前的 SHA-1 值(因为当前的值似乎不起作用)。一旦你有了它,你(我认为)可以(在你自己的计算机上)执行以下操作:

$ git checkout -b temp
$ git update-ref refs/heads/temp $SHA1
$ git push -u origin +temp:master

这将撤消服务器上的合并操作。

您可以获取以前工作的 SHA1,而无需从服务器获取 reflog。在您的本地仓库(或您朋友的本地仓库)中,之前工作的提交 确实 存在于那里的某处。如果你能想办法在那里找到它,那么你可以继续上面的建议。

OLD:这是我的第一个想法。如果您能够从服务器 复制.git/logs 目录,那么它将在其中存储master 分支的所有先前值。具体来说,文件.git/logs/refs/heads/master 将是一个原始文本文件,其中包含该分支的先前值。例如(我不知道github是否允许你这样做):

$ git clone https://github.com/dapphp/securimage.git -b audiofixes
$ scp github.com:/dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master
$ git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1} #see "Date Spec" section of http://book.git-scm.com/4_git_treeishes.html

这应该理论上将值更改为 master 之前的值。但是,它只会在本地执行此操作,实际上不会更改服务器上的值,而这正是我们真正需要的。因此,如果您可以直接 ssh 到服务器并在那里运行最后一个命令,那么(再次,理论上)只需撤消合并即可永久解决问题。

.

这就是我能想到的全部。但我真的很喜欢解决这样的 git 难题,所以我会让它在我的脑海中停留更长时间:)

【讨论】:

  • 感谢您的努力,尝试运行 scp 命令时出错。我现在必须下班,几个小时后回家后会再试一次。我不确定发生了什么,但也许 github 不允许 scp。 Invalid command: 'scp -f -- dapphp/securimage.git' You appear to be using ssh to clone a git:// URL. 确切的命令是:scp git@github.com:/dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master(如您所见,没有-f 选项)。
  • 再次感谢您的帮助,周末后我有点忘了这件事。这是 GH 的一个问题,显然有一个小时间窗口,一个错误导致一些对象丢失。他们能够将 repo 恢复到提交之前的状态,然后我重新推送,一切都很好。感谢您对此事的意见!
猜你喜欢
  • 2021-10-19
  • 2014-04-08
  • 2014-12-14
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多