簡體   English   中英

Git回購:內部和開源外部分支

[英]Git repo: internal and open source external branches

為公司內部使用的項目設置git repo的最佳方法是什么,但您也想開源(但可能會修改歷史記錄)?

假設Acme公司有一個倉庫“ supercoolproject”。 他們想開源它,但實際上他們根本不需要與它關聯的公司名稱。 他們使用其開發人員的姓名(或組名等)建立了一個GitHub帳戶,並創建了倉庫。 他們將其克隆到內部Acme服務器。 沒有地方提到“ Acme”。

現在出現了問題-在任何給定的組織中,都有開發人員了解開源並有權將某些代碼公開。 有些人不了解所有細微差別。 當其中之一提交時,它們可能包括公司名稱或其他專有信息。 或者,他們只是做出可以在內部還原的可怕提交(而不是重寫歷史記錄-我只是在談論添加“還原”提交)。 但是,您不希望那些專有的提交進入開源分支。

因此,您將創建“ acme_internal_ {dev,qa,production}”分支和一個外部“ master”分支(可能還有其他分支)。 保持同步的最佳方法是什么? 您要接受對開放源代碼回購的提交。 而且您想推出(大部分)內部提交。 但是有些不該出去。

似乎合並內部->外部是一件壞事,因為您無法刪除錯誤的提交。 可以在內部分支上重新建立外部分支的基礎,但是似乎一旦您“ git rebase -i acme / acme_internal_dev”一次並修改歷史記錄(更改提交消息,刪除提交等),您就無法再進行基礎了,因為兩種歷史是不同的。 那么,您最終將所有內部提交全部挑選到公共分支中,然后將公共分支合並到內部樹中嗎? 這看起來也很丑陋,因為您最終會在內部進行重復的提交(原始提交,然后是經過精心挑選的提交到外部的提交,然后又合並回內部)。

出於這個問題的目的,讓我們假設Acme內部希望避免重寫其內部分支上的歷史記錄(實際上是刪除/修改錯誤的commits)。

您可以采取一些措施來利用要維護的雙重倉庫的DVCS特性。


首先,永遠不要直接向內部公開內部倉庫(具有“外部”分支的想法)。 除了“外部分支”,沒有其他東西,只有“外部-或'公共'回購協議”。

一種可能的設置是使倉庫暴露於外界(外部貢獻者可以向其推送或撤出)。


其次,切勿直接(從acme內部)推向該外部回購協議:錯誤太容易實現,並且您無法控制完成進度的速度。 即,一旦您輸入錯誤的內容,即使是迅速的糾正也可能會遲到。

您需要一個中間存儲庫,該存儲庫仍在內部進行管理,以供審核。 即檢查已推送的內容,如果可以,則將其從外部存儲庫中拉出。
這意味着外部存儲庫知道中間存儲庫(它已在其遠程服務器中列出),反之則不成立(您不能從內部存儲庫中錯誤地推送)。
這使得發布過程更加明確(您必須轉到外部存儲庫服務器並提取要發布的更改,而不是呆在熟悉的內部環境中,並且不小心進行推送)


在中間存儲庫(acme的開發人員可以在發布之前將其推送到進行審查的存儲庫)上充分利用以下內容:

  • 預先接收鈎子(進行各種控制:如果提交不符合發布標准,則提交將被拒絕,然后開發人員可以在其自己的存儲庫中重寫歷史記錄)。
    同樣,重寫歷史記錄是可以接受的,只要它在acme開發人員存儲庫中即可。
  • 內容過濾器驅動程序(例如,請參閱此問題 ),以便不必在敏感文件的兩種存儲庫之間對不同的內容進行版本控制(如“ gitignore而不是gitignore之類的東西 ”)。

解決方案是擁有一個受嚴格控制的“外部可見”存儲庫,該存儲庫只能由那些有權推送到github的開發人員來提交。

內部存儲庫中的代碼僅由允許的開發人員集成和合並,從而使其進入外部可見存儲庫。 簡而言之,未經許可的開發人員必須通過補丁文件將代碼提交給允許的開發人員,或者針對公共倉庫提出請求。

是的,這意味着擁有權限的人將必須檢查和集成每個補丁。 但是,由於您不信任未經許可的開發人員,因此您希望他們以任何方式這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM