2012-04-10 43 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