簡體   English   中英

如何保持git repo的公共和私有版本同步?

[英]How to keep public and private versions of a git repo in sync?

我正在Github上發布一個開源的Rails應用程序(可能是麻省理工學院的許可證)。 我還想維護項目的私有分支/分支,我們將將其用作付費服務的一部分。

在這種情況下組織回購的最佳方法是什么? 而且,當我有更新應該同時進行時,如何讓項目保持同步?

最簡單的解決方案是在您的“私有”存儲庫中擁有私有分支 ,即只是不將其推送到公共存儲庫的分支。

為此,您可能需要指定要在config中推送到公共存儲庫的所有分支(而不是使用globbing鏡像refspec +refs/*:refs/* ),或者仔細推送要發布的分支並依賴於Git行為推送匹配分支(遠程端存在的分支)將“push.default”設置為當前默認值“匹配”。

如果您偶然推送您的私有分支,您可以使用“git push < remote >:refs / heads / < private-branch >”將其刪除在遠程存儲庫中(除非它被配置為禁止此)(要記住這一點:push empty遠程分支的價值)。 您可以使用遠程端的鈎子防止意外推送您的私有分支,請參閱contrib / examples中的例如update-paranoid示例鈎子。


旁注: Junio C Hamano,git維護者,推送公共git存儲庫只指定一組分支:'maint','master','next','pu'(建議更新)和'html','man','去做'; 他沒有發表短暫的,經常變化的特征分支。



示例設置:

working repository  ---->  private repository (bare)  ---->  public repository  
    \------ private -------/     \------- protected ------------/     \------- public -----/

工作存儲庫 ”是具有您提交的工作區域的存儲庫,您可以在其中提取更改並解決沖突; 您在哪里工作。 假設它包含以下分支:“公共”包含可以發布到世界的更改,“私有”,您希望不與他人共享或僅與選定的人員共享,也許某些功能分支如“票證 - 234'或'add-frobnicator',即使對於選定的組也看不到。 此存儲庫是非裸的,因為它未發布。

它將具有類似於以下配置的推送到“私有”存儲庫。 請注意,“匹配分支”行為在此處明確設置,請參閱git-pull手冊頁:

[remote "private"]
        url = user@example.com:/srv/private/git/repo.git
        push = +:

私有存儲庫 ”是僅供選定人員使用的公共裸存儲庫,例如,它僅可通過SSH獲取。 它只有准備就緒的分支,即“公共”和“私人”分支; 這些分支在創建“私有”存儲庫時存在,或者從“工作”存儲庫中明確地推送(“git push private <branch> ”)。 從“工作”存儲庫推送僅推送(傳輸)匹配的分支,即僅“公共”和“私有”分支。

“私人倉庫”有post-updatepost-receive其推動“公共”分支只能以“公共庫”(見下文),如果它被推到它(當然,它可以無條件地推)掛鈎集。

公共存儲庫 ”是可供所有人使用的公共裸存儲庫,例如它托管在GitHub和/或Gitorious和/或repo.or.cz上,或者可能通過git:// protocol使用git-daemon提供。 它只包含'public'分支,它使用updatepre-receive來接受分支的whilelist(這里只接受'public'分支),或者拒絕分支的黑名單(在這個例子中推送/創建'private'分支會被拒絕)。 推送到“私有”存儲庫時會自動更新。

根據您的需要,此設置可能過於復雜; 在您的情況下,可能不需要“私有”存儲庫。 在這種情況下,“工作存儲庫”中用於直接推送到“公共存儲庫”的配置如下所示:

[repository "public"]
        url = ssh://example.com/srv/git/repo.git
        push = refs/heads/public:refs/heads/public

我希望這個例子有所幫助; 但請閱讀文檔,不要盲目使用。

如果關於“付費服務的一部分”的代碼是獨立的(即“在另一個目錄中”)而不是代表推送到公共存儲庫的“開源Rails應用程序”的代碼,您可以:

  • 將公共部分定義為獨立的存儲庫(您可以隨時按下)
  • 將私有部分定義為另一個獨立的存儲庫
  • 使用子模塊將您的公共部分包含在您的私有存儲庫中

這樣,您正在使用所有系統(公共Rails應用程序+私人支付系統),但只將公共部分推送到GitHub,您可以將所有系統(私有+公共)推送到另一個私有存儲庫(在備份計算機上)例如)。


如果私人代碼與公共代碼混在一起......那么請參閱Talljoe的回答JakubNarębski的回答

暫無
暫無

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

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