2012-06-04 46 views
4

什麼是爲您的公司內部使用的項目設置git回購的最佳方式,但是您還希望開源(但具有可能修改的歷史記錄)?Git回購:內部和開源外部分支機構

比方說,Acme公司有一個回購「supercoolproject」。他們想要開源,但實際上並不需要公司名稱。他們使用其開發人員的名字(或團體等)設置了一個GitHub帳戶,並創建回購。他們將其克隆到內部的Acme服務器。沒有提到「Acme」。

現在出現了這個問題 - 在任何組織中,都有開發人員瞭解開放源代碼並被授權公開推送一些代碼。還有其他人不明白所有的細微差別。當其中一個提交時,可能包含公司名稱或其他專有信息。或者,他們只是做了一個可以在內部恢復的可怕提交(而不是重寫歷史記錄 - 我只是在談論添加「還原」提交)。但是,您不希望這些專有提交進入開源分支。因此,你創建了「acme_internal_ {dev,qa,production}」分支和一個外部「master」分支(也許還有其他人)。保持同步的最佳方式是什麼?您想接受開源回購上的提交。你想推動(大部分)你的內部提交。但有一些不應該出去。

看來,合併內部 - >外部是一件壞事,因爲你不能刪除壞的提交。外部分支可以在內部分支上重新分配,但似乎只要一次「修改rebase -i acme/acme_internal_dev」並修改歷史記錄(更改提交消息,刪除提交等),您就不能再分配,因爲兩個歷史分歧。那麼,你最終會挑選所有內部提交到公共分支,然後將公共分支合併到內部樹中嗎?這看起來也很醜陋,因爲你最終會在內部重複提交(原始文件,然後選擇進入外部並被合併回內部)。

爲了這個問題的目的,我們假設Acme內部想要避免在其內部分支上重寫歷史記錄(實際上是刪除/修改壞通信)。

+0

最好的解決方案(你想從外部看到的分支,但有一些只在內部可用的提交)是櫻桃採摘。對不起,說。 – Greg

回答

1

您可以採取一些措施來利用您要維護的雙倉庫的DVCS性質。首先,永遠不要直接向內部公開一個內部回購(有「外部」分支的想法)。除了「外部分支」,只有「外部 - 或」公共「回購」纔有這樣的東西。

一個可能的設置是讓repo公開給外部世界(外部貢獻者可以向其推送或從中拉出)。


其次,從來沒有(從ACME內)直接連接到外部回購推:錯誤是太容易做的,你不完成什麼樣的速度拉控制。也就是說,一旦你推錯了東西,即使是迅速的糾正也許會來得晚。

您需要一箇中間回購,內部管理,用於審查目的。即檢查推送的內容,如果這些新提交都可以,請將它們從外部回購庫中取出。
這意味着外部回購知道中間回購(它有它在遙控器中列出),相反是不正確的(你不能錯誤地從內部回購推)。
這使得一個更明確的出版過程(你必須去到外部回購服務器和拉要發佈的更改,而不是停留在一個熟悉的內部環境,推動有點漫不經心的)


在中間回購(acme的開發人員可以在發佈之前推送的那個回購)中使用得很好,其中:

  • 預接收鉤子(用於進行各種控制:如果提交不符合發佈標準,它被拒絕,然後開發人員可以在他/她自己的回購中重寫歷史記錄)。
    同樣,重寫歷史記錄是可以接受的,只要它是acme的開發者回收庫中的控制。
  • 內容過濾器驅動程序(例如參見this question),以便不必爲敏感文件(如「Something like gitignore but not git ignore」)中的兩種回購之間版本不同的內容。
1

的解決方案是讓這隻能通過那些誰有權推到GitHub的開發者致力於嚴格控制「externaly可見的」信息庫。

來自內部存儲庫的代碼僅通過允許的開發人員將其集成併合併到外部可見存儲庫中。簡而言之,未經許可的開發人員必須通過補丁文件或公開回購請求將其代碼提交給允許的開發人員。

是的,這意味着獲得許可的人將不得不審查和整合每個補丁。但是,由於您不相信未經許可的開發人員,所以您希望他們無論如何都這樣做。