2012-10-09 46 views
8

我正在使用git-subtree(來自Avery Pennarun)。在我目前的git repo中,我當然有 我所有的項目文件/文件夾和一個名爲「lib」的子樹。 如果我現在使用git clone克隆這個git repo,我得到了所有的項目文件和 子樹「lib」(應該是它的一切)。 我現在嘗試的:我在克隆的 repo中的子樹「lib」中更改了某些內容,並試圖使用 git subtree push將更改推回到子樹「lib」的遠程回購,但它沒有奏效。問題是什麼?我必須添加它 作爲子樹第一次與git子樹添加?git-subtree:推送來自克隆回購的更改

THX提前

+0

您是如何將子樹添加到頂級項目的?你只是建立一個目錄並克隆進它? –

+0

嗨!我使用「git subtree add」將子樹添加到我的頂級項目中。也許我的問題還不夠清楚:如果我在其他機器上克隆回購,那麼我將所有項目文件加上子樹「lib」。現在我在克隆的repo中的子樹「lib」中更改了一些內容,我無法使用「git subtree push」將更改推回到遠程服務器,這是我的問題。 – arge

+0

答案有幫助嗎? –

回答

14

聲明,我懷疑我在你前面只有幾天性學習的有關子樹:-)

如果你只是使用git subtree push你不給子樹足夠的信息來提取和推動你的改變。

如果您正確地克隆了回購,子樹已經在那裏。需要知道子樹需要從哪個子樹中推出(即使只有一個子樹),並且還需要知道應該推到哪裏 - 具體而言,您不希望推向頂層回購。因此,你想要的東西是這樣的:

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

顯然repo和refspec應該改變,以符合你的回購。

如果你想看看這裏發生了什麼(它確實有幫助),子樹實際上會將影響子樹內文件的更改分解到不同的分支,然後將其推送到子樹回購。看到這樣的情況,使用subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

然後看看你所做的分支:

git checkout lib-changes 

和手動把他們

git push [email protected]:arges-github/lib.git master 

如果不是那麼可能是因爲您沒有將子樹合併到您的回購庫中。當您添加子樹時:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

您還需要合併子樹並將其推回到您的頂級回購。

git subtree pull --squash --prefix lib [email protected]:arges-github/lib.git master 
git push 
+0

我已經執行了步驟,直到「添加」。沒有找到任何文件表明後續的「拉」是必需的。如果在「add」之後的子樹上沒有完成初始第一次「拉」,會發生什麼情況?我面臨的問題是,即使在使用--squash「添加」後,當我嘗試「子樹推送」時,它會開始檢查自該時間開始以來該子樹上的所有提交,即使我希望它只推送那些提交在子樹被「添加」回到容器回購之後。 – Nishith

1

我有完全相同你有同樣的問題,我解決它基本上使用方法羅傑·諾蘭建議。但是,如果您不幸像我一樣使用不區分大小寫的文件系統,則還必須確保每次執行pull和push操作時,前綴的大小寫都保持不變。

當你最終混淆錯誤的情況下,混帳會認爲你有兩個子樹,而只有一個將存在於文件系統。

所以,我結束了(如果它可以幫助任何人)的解決方案是:

  1. 創建一個腳本,將推動你的子樹。叫它publish_<your-subtree-name>
  2. 創建另一個腳本來拉你的子樹。叫它update_<your-subtree-name>
  3. 在HEAD上創建臨時分支並測試更新。如果你的腳本是正確的,你的臨時分支將不會移動。
  4. 在其他地方克隆子樹回購,添加一個測試提交,推送它,並嘗試使用剛剛寫入的更新腳本將其存入您的回購站。
  5. 如果一切正常,請刪除您的臨時分支,然後將兩個腳本都簽入到超級項目回購中。
  6. 然後,無論何時您需要推或拉子樹,請使用腳本。

PS>的--squash參數是很重要的,特別是如果你的reporsitories的不同分支拉子樹的不同分支,也如果你在你的項目中多個子樹。