2015-05-31 51 views
10

我最近一直在研究一個API庫,它將一個相對較大的外部API的部分封裝到一個更習慣的結構中。正如我在編寫原型代碼時進行API探索一樣,我最終實現了三種具有不同功能級別的可用子API。或者把它簡單來說,我有一個項目,該項目結構看起來像將原型代碼重構Git回購到實際可發佈的項目

dir:root 
└ dir:feature-a 
└ dir:feature-b 
└ dir:feature-c 
└ dir:common 
└ file:build.gradle 
└ file:build.py 

各功能與子API之一匹配。值得一提的是,目錄並不平坦,爲簡單起見,我只是省略了子目錄。

我的主要問題是,雖然我曾經爲一次提供過半體面的版本歷史,但它都在一個分支中,只有一個子API準備好發佈。理想情況下,我想找到最便捷的方式

  1. 拆分現有的回購協議,這樣我可以把每一個功能到自己的分公司,這樣我可以用一個,因爲他們還不夠成熟
  2. 發佈他們一個保持當前的版本歷史記錄(有一些墊底,有可能)

我以前用過git filter-branch出於類似的目的,但一個主要的曲線在這裏的球是版本庫的根實際上是另一個倉庫 - 對元級的檔案庫有兩個父母坦承時髦和v這對於保持構建腳本是最新的有用,但如果我試圖按照我想要的方式執行我想要的內容,項目根目錄下的構建腳本將被刪除,這絕對不是我想要的。

最後,common目錄有點特別 - 我不介意削減它的版本歷史,只要它的內容在那裏。

+1

可以接受使用子模塊而不是功能投入分支嗎? –

+0

@Nick我通常不會*喜歡*子模塊,但如果您的建議有意義,那麼顯然我可能會接受它 - 我更關心最終結果:) – Esko

+1

您可以詳細說明「雙親」及其與存儲庫的關係嗎?對不起,我不清楚。這些父母是外部API的持有者嗎?你的存儲庫是這些父母的分支,他們有共同的承諾,還是普通的樹?除了保留歷史記錄,您的最終目標是什麼 - 您是否希望回饋父母?一個小樣本的回購和描述「重組後,我希望功能-B,功能C不見了,功能,等等等仍然會說明。 – javabrett

回答

4

摘要

如果你想保留的一些公共資源(build.*)的歷史,保留那些資源輕鬆可合併在未來,要重寫/過濾/刪除一個子集從幻燈之前

  • 所有常見的提交:在資源庫中使用git filter-branch其他樹(feature-acommon),你首先應該重新寫你現有的提交順序ct從模板中分出(這已經是這種情況)。
  • 所有提交修改build.*,包括本地更改和從您的上游搖籃合併。
  • 最後,所有項目特定提交feature-*common

然後,您可以在項目特定的開發線上安全地運行git filter-branch,而不必重寫任何上游資源歷史記錄。如果你不這樣做,你可能最終會重寫包含構建腳本的提交,包括來自上游Cradle的合併提交,這將阻止歷史追溯和未來合併。

詳細

這聽起來像你有一個黃金項目模板,稱之爲T,並且每次啓動一個新項目的時候,你叉即回購(無論是在傳統的GitHub的感覺,或者只是創造什麼將是一個不同的克隆)稱之爲Pn。因此,PnT以相同的歷史記錄和常見提交開始(稱爲分支點Pn-0)。

由於Pn開發了其代碼庫,其他項目可能會識別對基礎項目模板基礎結構的改進,並對T中的文件F進行更改。任何項目Pn可能會在模板之前進行數百次提交,但仍可以合併來自T的公用文件中的更改。

現在,您想在Pn中重寫歷史記錄。由於Pn-0您已經完成了許多項目特定的提交,然後從T合併,然後進行更多項目特定的提交。如果您必須重寫P返回Pn-0以便filter-branch,從T的合併歷史記錄丟失,因爲歷史記錄已經分歧,並且未來從T合併成爲地獄。

這是否描述你的問題?

我想你會發現使用項目克隆模板的方法有其侷限性,當你想有充分的自由歷史重寫來重新組織你的項目回購。如果您在合併提交之前和合並後提交的歷史記錄都是從T提交的,那麼您將不得不進行一些花哨的重組以保留共同的歷史記錄。該解決方案:

  • Tx是最近提交的其已執行的完全合併到PnT
  • T取回到Pn回購庫中,並在Pn中創建一個以提交Tx開頭的分支。
  • 衍合當前Pn歷史上分支,從Pn-0基地(與T共同提交)移動它Tx,與T最新的共同承諾。

這種方法將重播你的整個歷史中Pn,如果它開始與Tx代替Pn-0,所以犯Pn-1擁有新的父Tx。當然,每個提交將被重寫,所以任何現有的克隆Pn立即被孤立。

一旦你有了這個,你可以自由運行git filter-branch開始重寫提交Pn-1,並刪除任何不完整的模塊的歷史。

現在 - 這是一個相當麻煩的事情,並且用棘手的方式重寫歷史,但歷史將被保留。你不希望每天都在做這個過程。

您可能要考慮的一件事是,是否有任何方式可以生產和消費您的搖籃,而無需共享源代碼。它可能不如Git合併那麼方便,但是如果您的模板項目受版本控制,並且您可以使用organize your build logic,也可以使用shared scripts,則可以對模板項目進行模塊化,以便不再依賴維護常見源歷史記錄的子項目合併 - 他們只會使用最新的模板二進制文件。取決於構建邏輯之外的模板內容。