2013-08-30 29 views
0

我正在尋找一種實用的方法來處理私人和公共存儲庫中的私人存儲庫的內容可能與公共分支。該文件夾必須存在於兩個分支中,並且其內容在兩個存儲庫中都被跟蹤,但絕不能合併。git工作流:公共和私人存儲庫的文件夾內容分歧,但不會合並

這是庫的簡化設置:

/folderA <-- public content 
/folderB <-- mixed public & private content 
/folderB/private.files <-- this file is different in public & private repos 
/folderB/newPrivateFolder <-- private repo may add more private-only folders here 

這些都是我看似簡單的要求,但我還沒有找到一個好工作的解決方案:

  • private.files必須存在於公開回購項目的默認內容工作
  • 更改爲private.files公開回購不應與私人回購
  • private.files變化必須私人回購,因爲它是由團隊成員
  • 變化需要private.files私人回購絕不能公開回購
  • 合併跟蹤合併額外的文件/文件夾添加到folderB私人回購絕不能添加到公共回購
  • 私人回購承諾應該孤立,私人回購的歷史不應該與公共回購合併

私人回購是公共回購的副本。

我曾嘗試:

  • 包括公共回購爲子模塊子樹
    • 不能「越權」的私人文件夾的內容,因爲變化,包括它的時候直接去公共回購子模塊或子樹
    • 加上:有點沒有意義將整個項目作爲子樹包含,因爲我想要兩個相同存儲庫的不同版本
  • 稀疏結賬
    • 合併還是合併所有文件/文件夾,即使是那些沒有在當地的分公司簽出
  • 屬性合併篩選
    • 僅合併時應用內容,但仍然允許添加/刪除文件

我還沒有試過尚未:

  • 兩個完全斷開連接庫(不重複),並以某種方式將其合併,同時確保FolderB中內容是「乾淨的」
  • 本地合併回購所有私人回購在與公共回購分支合併之前,特定文件夾中的分支更改被撤消(如何?)(實際上,我已經嘗試過這種方式,它似乎適用於稀疏檢出 - 但是一旦將所有私人更改推送到公共回購站)

還有什麼我可以嘗試?

也許這個問題已經有了解決方案 - 但我一直在看網上幾十篇文章和數十篇文章,但似乎沒有解決這個分歧的文件夾內容問題。

回答

1

在類似的情況下(部署到不同的安裝與小的本地,但永久修改)我已經使用主分支,包括什麼或虛擬文件在有問題的文件夾。然後爲每個本地配置(這將是私人和你的情況下公開),我創建了一個關閉主分支,並做了相關的更改。

發展發生在主人和偶爾我切換到其他分支(私人/公共),並從主合併到這些分支,從來沒有反過來。不同的配置(私有/公共)只能共享來自主機的代碼,而不是局部修改,我可以無限期地保留它們,並且我仍然有一個且只有一箇中心位置用於更改/開發(主分支)。

+0

這給了我一個想法:folderB進入它自己的存儲庫,作爲子庫包含在主存儲庫中。然後,我將主repo和folderB repo都複製到私有回購站,並希望我可以設置私人回購以使用私人folderB副本作爲其子樹。 – LearnCocos2D

1

現在看來這麼簡單,我想通了。實質上,您只需刪除合併中的folderB並將其替換爲其公共內容,然後提交。

基本設置要求:

  • 公共回購在FolderB中充滿了最初的「默認」的內容
  • 重複的公共回購到私人回購使用this guide(僅適用於第一碼框)
  • 公共和私人回購連接在當地回購作爲分支與他們各自的起源 - 這個地方回購是合併發生
  • 做你的私人分支的工作

現在當私人回購已經對folderA和folderB進行了修改&的添加,並且您希望將除folderB以外的所有更改合併回公共回購時,您將按如下方式合併(我建議使用一個額外的合併分支來安全實驗用它):

  • 合併私有分支進入公衆(或合併)的分支 - 做承諾尚未
  • 運行回購以下命令(假設合併分支):
    • git checkout merge-branch
    • git merge -s recursive -Xtheirs --no-edit --no-commit private-branch
    • rm -rf folderB
    • git reset <tree-ish> -- folderB/
    • git checkout --theirs <tree-ish> -- folderB/
  • 現在提交照常

這裏做的事情:

  • 檢查合併分支的變化(建議使用一個,它應該是最新的原點)
  • 合併接受來自私有分支的所有更改(合併「他們的」),沒有編輯防止合併從想要輸入我們(提交消息)並且沒有提交可以阻止提交,因爲我們要在提交之前清理工作目錄
  • rm從工作目錄中刪除整個folderB及其內容(包括子文件夾)。這可以防止在提交時將任何添加的文件/文件夾添加到分支的索引,因爲您剛刪除它們。
  • 重置使用「tree-ish」(即分支或在我的情況下,我使用提交SHA)重置文件夾的索引和工作目錄B
  • checkout然後將當前狀態folderB恢復到它的HEAD在公共回購中的狀態。這意味着從公共回購的角度來看,folderB的全部內容保持不變。

我不確定是否重置和結帳都是必要的,但我仍然在做。隨意試驗。

因此,如果在合併後和提交之前清除工作目錄,則專用分支中folderB的任何更改的提交歷史記錄都不會添加到公共庫中。

我試着用post-merge hook來做這個工作,但是如果你沒有提交,它似乎不會運行。除了將所有命令放在一個腳本中更容易。

合併公共回購更改回私人回購正常工作,不需要額外的步驟。

相關問題