2009-05-05 169 views
72

我有一個git超級項目引用了幾個子模塊,我試圖鎖定一個工作流程,以供我的其他項目成員在其中工作。如何管理與git子模塊的衝突?

對於這個問題,可以說我的超級項目名爲supery,子模塊名爲subby。 (然後是我想要做的簡化...我實際上並沒有使用分支的版本,但我認爲這將是最簡單的佈局作爲一個問題。)

我的主分支supery具有引用爲子模塊的git項目subby的標記v1.0supery的分支名爲one.one,並將子模塊的參考號更改爲指向subby的標記v1.1

我可以在每個分支中順利工作,但如果我嘗試更新one.one分支,並從master分支中進行更改,我會收到一些衝突,我不知道如何解決這些衝突。

基本上,在subby分支中運行git pull . master後,它看起來像創建了其他子模塊。

拉/合併之前,我從git submoduleone.one分支所需的響應:

$ git checkout master 
$ git submodule 
qw3rty...321e subby (v1.0) 
$ git checkout one.one 
$ git submodule 
asdfgh...456d subby (v1.1) 

但拉之後,當我運行增加了額外的子模塊git submodule

$ git pull . master 
Auto-merged schema 
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e 
Automatic merge failed; fix conflicts and then commit the results. 

$ git submodule 
qw3rty...321e subby (v1.0) 
asdfgh...456d subby (v1.1) 
zxcvbn...7890 subby (v1.1~1) 

如何刪除/忽略不需要的子模塊引用並提交我的衝突和更改?還是有一個參數,我可以用我的原始git pull將忽略我的子模塊?

回答

11

我以前沒見過這個確切的錯誤。但我猜猜你遇到的麻煩。它看起來像因爲superymasterone.one分支包含的子模塊subby不同裁判,當你從master混帳合併更改不知道哪個裁判 - v1.0v1.1 - 應保持並通過superyone.one分支跟蹤。

如果是這種情況,那麼您需要選擇所需的ref並提交該更改以解決衝突。這正是你在用重置命令時所做的。

這是在項目的不同分支中跟蹤不同版本的子模塊的棘手方面。但子模塊ref就像您的項目的其他任何組件。如果兩個不同分支在連續合併後繼續跟蹤相同的子模塊參考,那麼git應該能夠計算出模式,而不會在將來的合併中引發合併衝突。另一方面,如果開關子模塊經常參考,則可能需要忍受大量衝突解決。

+1

感謝您澄清問題。 這對我來說是完全意義上的,重置命令對我的情況完全適用。 但是,接受來自主分支的子模塊ref並丟棄ref到當前分支的子模塊的命令是什麼? 我知道如何處理正常的衝突,但經過三天的瀏覽網頁後,我找不到除rm -r之外的其他代碼示例。而且我開始認爲有這些例子不存在的原因。子模塊到目前爲止已經從超級項目中抽象出來,您必須管理每個轉換。 – Tyler 2009-05-07 20:26:25

+19

最後!一個答案!我在`git status`中添加了`:../ Mono.Cecil`,但`git add`和`git rm`失敗,因爲Mono.Cecil:需要合併,pathspec'Mono.Cecil /'不匹配任何文件「,因爲它只是一個空文件夾,而git只能處理文件。 `git checkout`給了我`Mono.Cecil:需要合併,錯誤:你需要首先解析你當前的索引`,`git submodule update`給``跳過未裝入的子模塊Mono.Cecil`和`git checkout master Mono.Cecil` FINALLY修復。基本問題:`git status`建議是錯誤的,所以選擇一個分支並用`checkout`將其文件夾複製一份! – IBBoard 2012-08-18 19:43:51

55

那麼,它沒有技術上與子模塊管理衝突(即:保持這一點,但不是),但我找到了一種方法來繼續工作......我所要做的只是注意我的git status輸出並重置子模塊:

git reset HEAD subby 
git commit 

這會將子模塊重置爲預拉式提交。在這種情況下,正是我想要的。而在其他情況下,我需要應用於子模塊的更改,我將使用標準子模塊工作流程(checkout master,下拉所需標籤等)處理這些更改。

+0

對於我這個似乎只是將衝突模塊的狀態從「兩次修改」更改爲「已刪除」。 – 2011-09-30 04:52:53

+2

你可能想保留合併分支的子模塊,而不是:git reset subby – 2015-02-03 12:30:08

+1

爲我在答案中規定。git reset HEAD path/to/submodule/dir – estoy 2016-12-09 16:13:16

12

首先,找到你希望你的子模塊引用的散列。然後運行

~/supery/subby $ git co hashpointerhere 
~/supery/subby $ cd ../ 
~/supery $ git add subby 
~/supery $ git commit -m 'updated subby reference' 

已經工作了我讓我的子模塊,以正確的散列引用,並與我的工作繼續沒有得到任何進一步的衝突。

18

我在這個問題上的答案掙扎了一下,也沒有太多的運氣,在a similar SO post的答案。所以這對我來說是有效的 - 記住在我的情況下,子模塊由不同的團隊維護,所以衝突來自master和我當時正在處理的項目的本地分支中的不同子模塊版本:

  1. 運行git status - 記與衝突的子模塊文件夾的
  2. 重置子模塊,這是最後一次提交的當前分支版本:

    git reset HEAD path/to/submodule

  3. 在這個POI NT,你有沒有衝突的版本的子模塊的,你現在可以更新到輔助模塊的庫中的最新版本:

    cd path/to/submodule 
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. 現在你可以commit這一點,回去工作。

6

我把這個問題與git rebase -i origin/master分支。我想採取主版的子模塊裁判,所以我壓根兒:

git reset master path/to/submodule

然後

git rebase --continue

這解決了這個問題對我來說。

0

從此討論中獲得幫助。 在我的情況下

git reset HEAD subby 
git commit 

爲我工作:)

0

那麼在我的父目錄我看到:

$ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
Unmerged paths: 
(use "git reset HEAD <file>..." to unstage) 
(use "git add <file>..." to mark resolution) 

所以我就做了這個

git reset HEAD linux