2017-08-13 47 views
3

有一個與master分支的git倉庫和幾個開發人員正在使用它(他們沒有訪問git-server,但可以推到master分支)。我的問題是:無論如何不可逆「損害」(刪除文件...)的存儲庫?開發人員是否可以不可逆轉地破壞git repo?

例如,開發人員可以刪除過去的10個提交:

git reset --hard HEAD~10 
git push -f 

有沒有在這種情況下恢復數據的方法(假設沒有人有那些過去的10本地提交)?如果是這樣,還有其他方法如何對回購做出不可逆轉的改變?

+3

您可以使用本地回購的reflog返回到原始提交(假設GC尚未運行)。雖然我認爲這是一個理論問題 - 但實際上,正確的方法是「防止將力量推向主分支」。 –

+0

你可以限制誰可以推送給主人 –

+0

@OliverCharlesworth我提到沒有人擁有刪除文件的本地回購。 –

回答

7

「不可逆」總是很難判斷。假設開發人員不是該存儲庫中唯一的開發人員,我們可以假設還有其他開發人員也擁有本地存儲庫 - 這是一個完整的副本 - 並且可以隨時恢復丟失的更改。

但是總的來說,是的,如果遠程服務器不拒絕這樣的動作,那麼可能會破壞整個存儲庫。一些託管解決方案提供對此的保護(不意味着防止惡意使用,而是爲了避免意外),您可以在其中配置強制推送被拒絕。但推動力只是一回事;實際上可以使用git push -d origin branch刪除遠程分支。所以你也需要防止刪除分支(至少關鍵,如主)。

但讓我們假設所有這些因爲某些原因而經過,並且有人設法強制推送引用某些提交無法訪問的存儲庫。假定一個默認的裸倉庫 - 許多解決方案仍然在底層使用 - 同樣的東西適用於任何本地倉庫:對象不會立即刪除,但只是變得無法訪問。無法訪問的對象使得它們成爲垃圾收集的對象,可能會永久刪除它們。所以如果垃圾收集沒有在遠程服務器上運行,對象可能仍然在那裏。

儘管仍然適用一般規則:進行備份。對於Git來說,這可以像定期更新本地克隆一樣簡單。

+2

請注意,裸存儲庫默認爲不存在引用日誌,並且至少舊版本的Git運行自動gc推後以防大量拒絕更新。 (較新的Git版本首先將更新對象放在其他位置,因此尚不清楚這是否仍然發生。) – torek

0

我開發了一天,停電導致我的回購。這是一個不可逆轉的破壞,因爲我沒有把它推到私人git服務器/ github/gitlab上,因爲我很懶,我對自己說,「明天我會這樣做」。幸運的是,只有.git死了,代碼本身沒有被破壞。我重新啓動了git,之後我在gitlab上做了一個私人回購。

所以我的回答是:如果你不在git服務器上備份任何東西會損壞回購:筆記本上的咖啡/可樂/啤酒,貓躺在你的鍵盤上, Windows崩潰

相關問題