2010-01-26 73 views
8

我想使用提供git集成的流行的開源問題跟蹤器(Redmine)。不幸的是,跟蹤器中的每個項目只能與一個git倉庫相關聯。在跟蹤器中創建多個項目不是我理想的設置。使用git子樹合併,同時也合併了所有合併子樹的所有分支

考慮到這一點,我試圖使用git子樹合併(解釋爲herehere)。我已經創建了一個「傘」回購合併在我正在與其他許多其他回購合併。

不幸的是,給出的例子只是拉在每個子樹的主分支。由於我在每個子樹的多個分支上進行開發,因此我需要學習如何讓這個傘回購反映每個子樹的每個分支。

這可能嗎?

額外信貸:如果2棵子樹都有一個同名的分支?

+0

解釋子樹合併的第二個鏈接是死的 - 試試[這裏](http://nuclearsquid.com/writings/subtree-merging-and-you.html)而不是 – runexe 2010-09-10 18:06:13

回答

7

對於我們不熟悉Redmine的人員,請將您的描述擴展爲包含以下問題的答案:跟蹤器需要對存儲庫進行何種訪問?它是否需要進行自己的提交?或者,它是否只需要某些類型的讀取權限(可能會驗證提交哈希和關鍵字的掃描提交日誌)?

如果您的跟蹤器只需要讀取權限,則根本不需要任何子樹合併。在一個存儲庫中有多個初始提交(允許多個獨立的歷史記錄)是完全可以接受的。 Git項目本身做這行共享,沒有(提交)歷史上的一些「額外」(HTML待辦事項),但公佈旁邊的源代碼(MAINT主要組支路masternextpu)。出於您的目的,爲每個子存儲庫設置一個遠程服務器並將其分支提示提取到您的聚合存儲庫中可能已足夠。也許自動'遠程追蹤分支'就足夠了,或者你需要採取額外的步驟來創建(並更新)基於遠程追蹤分支的本地分支。

您描述的子樹合併方案在源存儲庫中的分支不相關或僅半相關的一般情況下可能沒有意義。但是,如果所有源存儲庫共享一組分支,其中每個分支具有在所有存儲庫中相同的特定目的,則可能有意義地將它們合併爲一種超級存儲庫。

但是有趣的問題不是「如果兩個存儲庫具有相同名稱的分支?」,而是「如何處理存儲庫缺少共享」全局「集合中某個分支的情況?」。

如果所有的子庫具有相同的組支路,你只是做你做了什麼與,但一旦每個分支。當存儲庫中缺少特定分支時會出現問題。你可以用代替,但這可能並不總是正確的答案。這取決於您爲什麼首先將這些存儲庫聚合到一起,以及您希望在超級存儲庫中該分支的子樹中「看到」的內容。

如果子庫是而不是密切相關,那麼我真的懷疑這個子樹方法的合理性。對於不相關的儲存庫來說,這種方法會讓人覺得它會「違背糧食」。這可能還是有可能的,但我懷疑是否有任何工具可以提供幫助,你需要花一些時間計劃出現的情況。

如果你結束了樹合併堅持,你可以看看第三方git subtree命令。它可能有助於保持您的無數存儲庫同步。


收集分行,但不合並

如果管理平臺指定--mirror克隆,其含義是,預計當地的分支機構,可能無法直接讀取「遠程跟蹤設有分公司」,所以你可能會需要創建和更新一些本地分支機構。

本地分行更新從「遠程跟蹤分行」
  • 初始設置

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO && 
    git init 
    git remote add alpha <url/path-to-alpha-repo> 
    git remote add bravo <url/path-to-bravo-repo> 
    git remote add charlie <url/path-to-charlie-repo> 
    for r in $(git remote); do 
        git config --add remote.$r.fetch \ 
         "$(git config remote.$r.fetch | sed -e 's.heads.tags.;s.remotes.tags/all.')" 
        git config remote.$r.tagopt --no-tags 
    done 
    
  • 定期更新

    git remote update 
    git for-each-ref --shell --format \ 
        'git branch --force --track -l all/%(refname:short) %(refname:short)' refs/remotes \ 
        | sh 
    
本地分行直接接收擷取的枝梢
  • 初始設置

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO && 
    git init 
    git remote add alpha <url/path-to-alpha-repo> 
    git remote add bravo <url/path-to-bravo-repo> 
    git remote add charlie <url/path-to-charlie-repo> 
    for r in $(git remote); do 
        git config remote.$r.fetch \ 
         "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')" 
        git config --add remote.$r.fetch \ 
         "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')" 
        git config remote.$r.tagopt --no-tags 
    done 
    
  • 週期更新

    git remote update 
    

這兩種方法最終refs/heads/all/<remote-name>/<branch-name-on-remote>下收集分支,但第一個也有refs/remotes/<remote-name>/<branch-name-on-remote>下重複組參考文獻的。第一種使用一個正常獲取的Refspec並使用git branch複製的「遠程跟蹤分支」(refs/remotes/…)進入正常,本地分支(refs/heads/all/…)。第二個使用自定義refspec將獲取的ref直接存儲到目標ref層次結構中。

因爲這樣的更新是盲目提取到該組合庫,任何人都不應該嘗試直接使用它:沒有直接提交其分支機構提出,沒有從外面推。如果有人在本地進行提交或推入其中一個分支,那麼在下一次更新完成時,這些提交將被清除。

如果管理平臺可以處理的裸庫,我會建議使用一個。使用git init --bare和以.git結尾的回購商標名稱。另外git config core.logAllRefUpdates true可能是一個好主意(因爲在裸存儲庫中默認爲false)。

除了在命名空間all/前綴,這種方法和全--mirror克隆之間的另一個區別是,外refs/headsrefs/tags裁判將不會被收集。大多數其他常見參考資料被認爲是對存儲庫的「本地」(這就是爲什麼它們不能被正常克隆複製的原因)。其他一些參考文獻是'遠程跟蹤分支'(refs/remotes),一些'平分'記錄(refs/bisect),git filter-branch'原始'備份(refs/original)等等。 Redmine可能沒有其他的東西是重要的。如果是,它們也可以包含在其他的refspecs中。

建立額外的初始提交的

要與新的初始承諾安排一個分支,看到GitTips pageHow to create a new branch that has no ancestor下。其中兩個配方涉及另一個存儲庫,在完成通常的init/add/commit步驟(正是上述配方以自動方式執行的操作)之後,您可以從中推入或取出分支。

+0

謝謝你的深思熟慮的迴應。 Redmine只需要對本地文件系統上的--mirror克隆進行只讀訪問。 這些子回購絕對不會共享同一組着名的分支名稱,這會使問題進一步複雜化。 遠程跟蹤分支/多個初始提交看起來很有希望,我會進行調查。 – anthony 2010-01-26 19:27:45

+0

恩,後續問題。我用什麼命令創建多個初始提交? – anthony 2010-01-26 19:46:24

+0

我很遺憾,我只能對這個問題答覆一次。 – anthony 2010-01-28 00:31:21