2015-06-30 46 views
0

我的一位同事試圖從我們的GitHub回購的歷史中永久刪除文件(Diff.java)。可以撤銷文件的永久刪除嗎?

他有很好的理由想要做到這一點,但似乎出現了問題,因爲我們似乎已經丟失了相當多的文件,這些文件已被替換爲後綴爲.REMOVED.git-id的等效文件。例如ivy-2.2.0.jar - >ivy-2.2.0.jar.REMOVED.git-id

我設法修復主開發分支,因爲我碰巧在本地有一個副本。然而,對於發佈版本的開發線和標籤來說,有許多歷史分支,現在似乎以上述方式被破壞。

據我所知,他跑了類似的過程:

$ git clone --mirror git://example.com/some-big-repo.git 
$ java -jar bfg-1.12.3.jar --strip-biggest-blobs 500 some-big-repo 
$ cd some-big-repo 
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive 
$ git push 

$ cd .. 
$ java -jar bfg-1.12.3.jar --delete-files Diff.java some-big-repo 
$ cd some-big-repo 
$ git push 

我猜測,這個過程是破壞性的,有沒有辦法恢復,除非我們正好有一個乾淨的鏡子前的某個地方發生這種情況。任何人都可以確認或提供一些建議?

回答

0

這是刪除了所有那些老罈子步驟:

$ java -jar bfg-1.12.3.jar --strip-biggest-blobs 500 some-big-repo

...爲BFG的作者,我很心疼,實現--strip-biggest-blobs 500並不像我想象的那樣清晰。該命令從存儲庫歷史記錄中刪除最大的500個文件(即大文件或二進制大對象:'blob')。我會非常有興趣知道用戶認爲這一步會做什麼!

這是正確擺脫Diff.java命令:

$ java -jar bfg-1.12.3.jar --delete-files Diff.java some-big-repo

instructions for the BFG「你應該進行備份」運行BFG之前版本庫的,但它聽起來像這沒有發生在這裏。

您可能仍然有機會恢復舊的分支和標籤,因爲兩件事情:

  1. 的倉庫,它的原始對象數據仍然可用。這將是你的本地副本,也可能是GitHub,因爲他們不會立即運行回收 - 對象可能仍然存在,甚至可能被舊的請求引用(如果使用它們)。我會立即對你的GitHub倉庫進行鏡像克隆。
  2. 您還需要舊的'ref'值(原始分支和標籤提交id)。您可能能夠在您的本地副本的reflog或CI服務器的日誌中找到它們。 BFG會在命令行中輸出更改的參考值的舊值和新值,但我猜你還沒有輸出。 BFG當前不保存該輸出,但它在每次運行時都會保存some-big-repo.bfg-report目錄下的 文件,其中包含舊ID和新ID,對於每次更改的提交都會包含舊ID和新ID。將會有不止一個這樣的文件,因爲BFG運行不止一次。使用這些文件並檢查當前的參考文獻,您應該能夠通過兩個BFG運行回溯,以找出您的參考文獻的原始提交id。

你恢復的過程,因爲那些東西,是這樣的:

  • 乘坐--mirror克隆最有可能仍包含您的舊對象存儲庫中。
  • 測試以確定它是否確實具有這些對象。因此,假設您可以確定master的舊ID是686b0cd80ac328e060b80dda3c9dadb1e400134a,請執行git cat-file -p 686b0cd80ac328e060b80dda3c9dadb1e400134a。如果對象仍在附近,您將看到提交摘要。如果不是,添加遙控器爲您的其他候選回購,並試圖從那裏
  • 數據拉動設置master分支到原來的價值承諾與git update-refgit update-ref refs/heads/master 686b0cd80ac328e060b80dda3c9dadb1e400134a

重複所有其他部門和標籤,你關心 - 希望你能腳本,祝你好運!

+0

謝謝@ roberto-tyler那裏有一些很好的建議。不幸的是,我的同事沒有創建備份。幸運的是,我發現了一個擁有大部分分支和標籤的舊鏡子,所以我能夠從那裏恢復它們。非常感謝您的幫助。 – adamretter