2013-02-08 71 views
28

我在使用git子模塊時遇到問題。無法簽出git submodule路徑

每當我接收從上游儲存庫中的新的子模塊的參考,執行git submodule update給出以下結果:

fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path' 

重要的是要注意該子模塊具有幾個遙控器,其中,要使用的上游遙控器是重要更新子模塊參考樹。我猜我的問題在那裏,但我不確定。

我的設置如下:

Git項目

遙控器:

  1. origin(我的git叉)
  2. upstream(項目回購)

子模塊 「模塊」,有遙控器:

  1. origin(我的git叉)
  2. upstream(項目回購)

有誰知道是什麼原因造成我的問題?

回答

32

在做git submodule update,混帳試圖檢出提交/這是保存在超級項目樹(在你的榜樣,在一個同提交ID dd208d4...

我想你,因爲子模塊有內部的錯誤沒有這樣的對象存在。你必須確保它在那裏。通常這意味着你必須首先從遠程獲取/拉取它。

也許你不得不

git submodule foreach git fetch 
git submodule update 

也許

git fetch --recurse-submodules 

假設,該子模塊設置,以便它可以獲取丟失的從遠程origin提交。最後,必須知道,從哪裏可以獲取失蹤的提交,你必須得到它。

你可以檢查,是否有dd208d4...做一樣的東西:

cd ./module 
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 

一個可能的原因對於這樣的問題,即一個誰公佈從超級模塊的新的承諾,也沒有發佈來自子模塊的必要提交。他必須首先發布來自子模塊的提交。

+0

子模塊提交公佈,仍然出現問題。 – Nuzzolilo

6

確保子模塊被推有:

cd submodule-dir 
git push 

就我而言,我有:

  • 致力於子模塊
  • 未按
  • 致力於父級更新子模塊
  • 推送父級

所以這也難怪,它不能被發現。

它可以自動與推進一步:

git push --recurse-submodules=on-demand 

根據需要,或2.7開始也推子模塊:

git config push.recurseSubmodules on-demand 
git push 
+0

基本上與以前相同的答案,但即使在推送時,有時仍會出現此問題。 – Nuzzolilo

+0

@Nuzzolilo您能生成一個最小的可重現的本地例子,例如'的mkdir回購&& CD回購&& git的初始化&&觸摸&& git的添加.' ... –

+0

見https://github.com/projectkudu/kudu/issues/1972 - 可與通過在部署鍵訪問子模塊發生Github上。對不起,沒有時間做更多的事情 – Nuzzolilo

1

我有同樣的問題,我決定增加一個新的承諾父項目,並推全部Check the Subproject commit and commit from your module

0

我的問題是,我的回購cat .gitmodules,我指着錯誤的遙控器s ubmodule的回購(我原本是用原裝遙控器克隆的,但後來轉而使用它的一個分支; gitmodules文件從未更新以反映更改)。

0

我的問題是我必須在他們的build.gradle文件中的子模塊(我認爲被自動更改)提交的更改。他們出現在git diff。我剛剛做了git checkout .重置子模塊回購沒有任何更改,然後git submodule update工作。

0

剛剛看到這個問題時,我忘了推在我的子模塊

的一個變化,確保更改推