3 回答

TA貢獻1833條經驗 獲得超4個贊
您應該能夠恢復添加到索引中的任何文件(例如,在您的情況下git add .
),盡管它可能有點工作。為了將文件添加到索引,git將它添加到對象數據庫,這意味著只要尚未發生垃圾收集,它就可以恢復。在JakubNar?bski的答案中有一個如何做到這一點的例子:
執行git reset后恢復添加的文件--hard HEAD ^
但是,我在測試存儲庫上嘗試了這一點,并且存在一些問題 - --cached
應該是--cache
,并且我發現它實際上并沒有創建.git/lost-found
目錄。但是,以下步驟對我有用:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
這應該輸出對象數據庫中的任何ref,索引或reflog都無法訪問的所有對象。輸出看起來像這樣:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
......對于每個blob,你可以這樣做:
git show 907b308
輸出文件的內容。
輸出太多了?
更新響應sehe以下的評論:
如果您發現該命令的輸出中列出了許多提交和樹,您可能希望從輸出中刪除任何從未引用的提交引用的對象。(通常你可以通過reflog回到這些提交 - 我們只對已添加到索引但永遠無法通過提交找到的對象感興趣。)
首先,保存命令的輸出,使用:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
現在可以找到那些無法訪問的提交的對象名稱:
egrep commit all | cut -d ' ' -f 3
因此,您可以找到已添加到索引但未在任何時間提交的樹和對象,具有:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \ $(egrep commit all | cut -d ' ' -f 3)
這極大地減少了你必須考慮的物體數量。
更新: 下面的Philip Oakley提出了另一種減少要考慮的對象數量的方法,即只考慮最近修改過的文件.git/objects
。你可以找到這些:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(我在這里發現了這個find
調用。)該列表的結尾可能如下所示:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
在這種情況下,您可以看到這些對象:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b git show de629830603289ef159268f443da79968360913a
(請注意,您必須刪除/
路徑末尾的內容才能獲取對象名稱。)

TA貢獻1982條經驗 獲得超2個贊
我只是做了一個git reset --hard并丟失了一個提交。但我知道提交哈希,所以我能夠做git cherry-pick COMMIT_HASH來恢復它。
我在丟失提交的幾分鐘內就這樣做了,所以它可能適合你們中的一些人。

TA貢獻1866條經驗 獲得超5個贊
首先,我將所有哈希保存到文件中:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes
接下來我將它們全部放入(刪除'無法訪問的blob'的東西)列表并將數據全部放入新文件中...你必須選擇你的文件并重新命名它們你需要...但我只需要一些files..hope這有助于某人......
commits = ["c2520e04839c05505ef17f985a49ffd42809f",
"41901be74651829d97f29934f190055ae4e93",
"50f078c937f07b508a1a73d3566a822927a57",
"51077d43a3ed6333c8a3616412c9b3b0fb6d4",
"56e290dc0aaa20e64702357b340d397213cb",
"5b731d988cfb24500842ec5df84d3e1950c87",
"9c438e09cf759bf84e109a2f0c18520",
...
]
from subprocess import call
filename = "file"
i = 1
for c in commits:
f = open(filename + str(i),"wb")
call(["git", "show", c],stdout=f)
i+=1
- 3 回答
- 0 關注
- 1060 瀏覽
添加回答
舉報