2010-02-01 272 views
8

起初:這是(希望)沒有重複的thisthisGit:從存儲庫中刪除憑證

當前狀態:我將一個內部數據庫憑證提交給我的Git存儲庫。這很好,因爲我只用它一個人。然後,我的團隊開始克隆,推動並推進這個項目。我們現在有幾個Git倉庫(一箇中心和一些開發人員)。

問題:我們現在想要公開訪問源代碼,並訪問Git存儲庫或至少讓Git管理其他人對代碼作出貢獻的細節。

問題:這將是一個很好的策略,以

a)將成立一個新的Git倉庫與來自中央或從所有倉庫的憑證文件,或

B)到外部世界的一種'界面'?

如果選擇(b),我們如何輕鬆地將更改傳回主存儲庫?

由於已經廣泛分佈,我們真的不想在每個當前的存儲庫上執行git rebasegit filter-branch

回答

9

對不起,但如果您想要從主存儲庫中刪除證書,則您將一直在運行git filter-branch。請參閱GitHub編寫的Removing sensitive data

由於git的設計,沒有辦法迫使現有的克隆從它們各自的歷史中刪除文件。

你可以清理一個分支,使其成爲未來發展的基礎:

$ git checkout -b old-master master 
$ git filter-branch ... master 

現在你需要消毒的主推到只包含清理大師一個新的回購:

$ git push new-central master 

如果需要,現有回購站可以將新的遠程和git cherry-pick更改從舊分支添加到新的清潔主數據庫。

對於新的存儲庫,請採取某種屏障來防止有人推送敏感數據,以免再次出現同樣的問題。這種障礙可能是控制新中央存儲庫並審查所有修補程序以決定進入的人的障礙。

2

沒有使用rebase或filter-branch,您無法做到a)。但我想說,現在這樣做可能會更好,而不是要永遠隱藏曆史。我猜b)可以通過在刪除憑證的提交之後拆分歷史記錄來完成。結果幾乎是兩個歷史,放在兩個不同的回購站;一個在清理之前,一個在之後「重新啓動」。這兩個回購的歷史可以通過graft-points在需要達到舊歷史的人的回購中聯繫起來。

無論哪種方式,你將不得不處理整個負載sh * t,並且我建議去a)和filter-branch,即使它是很多工作。

+0

對不起,不接受你的答案,但gbacon的答案中的GitHub鏈接是值得黃金重量。 – Boldewyn 2010-02-05 14:00:06

7

只需更改您的內部數據庫和任何其他具有相同密碼的服務的密碼。 (對於歷史中某處存在的任何其他密碼也是如此)。

+0

好奇,我忘了upvote這個答案。在我們的特殊情況下,這並不適用,但在一般情況下,這是一個廣泛的存儲庫格局,而且當我發佈一個我的寵物項目時,我甚至曾這樣做過。 (好像我應該在將來仔細檢查,我正在做什麼......) – Boldewyn 2012-04-18 13:16:48

1

所以,我們已經通過了,我想分享我們最終如何做到的。

我們處於幸運的位置,沒有人在某個特定的時刻擁有自定義分支。所以我們基本上做的是,所有人都把他們的最後一次推到中央存儲庫。

然後我們使用filter-branch就像GitHub船員所描述的那樣。那時我們有一個清晰的中央存儲庫。

最後(並且因爲沒有人提供本地分支而工作),我們刪除了本地存儲庫並從現在清潔的中央存儲庫中克隆了新的存儲庫。

簡而言之:通過這種方式,這是一個相當快速和無痛的過程。不優雅,但它的工作。