2012-04-10 41 views
1

我在GitHub上有一个存储库,位于here。我为某人创建了一个工作分支,他们分叉回购,在工作分支上做了一些更改并提交了一个请求。GitHub自动合并后致命错误

我尝试了所做的改变,一切都很好,自从GitHub提供自动合并请求后,我继续点击大的绿色“合并请求”按钮。除了对工作分支所做的更改适用于我可以生活的主分支以外,一切都很好。

现在的问题是,存储库不能被我或任何其他人获取。我得到这个错误:

[email protected]:/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但我仍然得到一个有关错误ref的错误,我找不到任何可以运行的命令来解决该问题。如有必要,我愿意撤销这些更改。

万一有帮助,一旦我复制一个不同的分支,这里是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 
+0

这听起来像一个问题,你应该联系GitHub。 – Amber 2012-04-10 22:00:11

+0

@Amber昨天晚上我发出了一个支持请求,现在还没有回应(不是我期待这么快),但是当我耐心地等待(im)时,我想我会在这里尝试与Git向导的运气。 – drew010 2012-04-10 22:01:20

+0

我很好奇:看看你是否可以粘贴'ls .git/refs/remotes/origin'和'cat .git/refs/remotes/origin/master'和'ls .git/objects'的结果 – 2012-04-10 22:26:18

回答

2

NEW:

显然1)的github不给ssh访问:(,和2)这是不可能通过GIT中协议共享不同的机器之间reflogs。

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

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

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

您可以在不必从服务器获取reflog的情况下获得以前工作的SHA1。在您当地的回购协议(或您的朋友的本地回购协议)中,先前正在执行的承诺确实存在。如果你可以找到一种方法来找到它,那么你可以继续上面的建议。

老:这是我的第一个想法。如果您能够从服务器复制.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/[email protected]{1} #see "Date Spec" section of http://book.git-scm.com/4_git_treeishes.html 

应该理论上值更改为是什么大师之前。但是,它只能在本地执行,而不会实际更改服务器上的值,这正是我们真正需要的。所以,如果你可以直接SSH到服务器,并在那里运行最后一条命令,那么(理论上)会通过撤消合并来解决问题。

这就是我能想到的全部。但我真的很喜欢解决像这样的混帐拼图,所以我会让它坐在我的头上更长的时间:)

+0

我欣赏努力,我试图运行'scp'命令时出现错误。我现在必须离开工作,几个小时后回家时会再试一次。我不确定发生了什么,但也许github不允许scp。 '无效的命令:'scp -f --dapphp/securimage.git''你似乎在用ssh来克隆一个git:// URL.'确切的命令是:'scp [email protected]:/ dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master'(没有'-f'选项,你可以看到)。 – drew010 2012-04-10 22:59:24

+0

再次感谢您的帮助,周末之后我忘记了这一点。 GH是一个问题,显然有一个小窗口,一个错误导致一些物体迷路。他们能够在提交之前将回购恢复到状态,然后我重新推出,一切都很好。我很感谢你对此事的投入! – drew010 2012-04-16 22:14:54