2010-11-15 1565 views
245

我有了在lib/three20在.gitmodule的路徑沒有找到子模塊映射,這不是一個子模塊

.gitmodule文件的子模塊項目如下:

[submodule "lib/three20"] 
    path = lib/three20 
    url = git://github.com/facebook/three20.git 

我已經在克隆這個過去沒有錯誤,(git submodule init後面跟着一個git submodule update),它已經工作了一段時間。

我試圖克隆此一臺新機器,現在我得到的git submodule init此錯誤:

No submodule mapping found in .gitmodules for path 'Classes/Support/Three20' 

這條道路是在Xcode只是一個空文件夾,我用它來容納從項目其他目錄。它不是.gitmodules文件的一部分,所以我沒有看到它從哪裏獲取此路徑。

任何想法?

+1

聽起來好像您可能已經設法將該路徑添加爲gitlink - 子模塊是gitlink和.gitmoddules和.git/config文件中的條目的組合。最近有一個關於這個問題的問題;試圖找到它... – Cascabel 2010-11-15 14:57:33

+9

@Jefromi:http://stackoverflow.com/questions/4161022/git-how-to-track-untracked-content/4162672#4162672? – VonC 2010-11-15 15:01:23

+0

@Jefromi - 我在'.git'文件夾的任何地方都找不到這條路。執行'grep -r「Classes/Support/Three20」*。*'不會產生任何結果 – 2010-11-16 04:36:18

回答

221

rajibchowdhuryanswer(upvoted),使用該建議git rm命令是用於(一個去除special entry in the index indicating a submodule '具有特殊模式160000文件夾')。

如果特殊項路徑.gitmodule(如「Classes/Support/Three20」在原來的問題)沒有被引用,那麼你需要將其刪除,以避免在.gitmodules發現了「無子模塊映射路徑「錯誤消息。

您可以檢查所有的指數,這是引用子模塊的條目:

git ls-files --stage | grep 160000 

以前的答案(2010年11月)

這可能是你還沒有宣佈您最初的子模塊正確的(即最後沒有任何尾部'/',如my old answer中所述,即使您的.gitmodule的路徑看起來沒問題)。

This thread提到:

do you get the same error when running 'git submodule init' from a fresh clone?
If so, you have something wrong.

If you have no submodules, delete .gitmodules , and any references to submodules in .git/config, and ensure the Pikimal dir does not have a .git dir in it.
If that fixes the problem, check in and do the same on your cruise working copy.

顯然,不刪除你的主要.gitmodules文件,但之後其他額外.gitmodules文件看在你的工作樹。


還是「不正確初始化子模塊」的主題,Jefromi提到的子模塊實際上是gitlinks。

請參閱How to track untracked content?爲了將這樣的目錄轉換爲真實的子模塊。

+2

我沒有任何.gitmodules文件,並且我仍然在每次結帳/取消時收到此消息。我該怎麼辦? – aaronbauman 2017-03-17 14:33:18

+0

在這裏找到我的答案:http://stackoverflow.com/questions/14720034/no-submodule-mapping-found-in-gitmodules-for-path – aaronbauman 2017-03-17 14:42:09

+3

@aaronbauman是的,你需要刪除gitlink,因此'git rm xxx'(不帶結尾斜槓)'git rm --cached'允許您將其保留在磁盤上,同時將其從索引中刪除。 – VonC 2017-03-17 15:00:05

13

我爲我解決了這個問題。最初,我試着這樣做:

git submodule add --branch master [URL] [PATH_TO_SUBMODULE] 

事實證明了--branch選項的規範不應該使用,如果你要克隆的主分支。它拋出這個錯誤:

fatal: Cannot force update the current branch. 
Unable to checkout submodule '[PATH_TO_SUBMODULE]' 

每當你嘗試做一個

git submodule sync 

此錯誤時會拋出:

No submodule mapping found in .gitmodules for path '[PATH_TO_SUBMODULE]' 

,並且從不加入.gitmodules所需的線。

所以我的解決辦法是這樣的:

git submodule add [URL] [PATH_TO_SUBMODULE] 
5

只是有這個問題。有一段時間我嘗試了關於刪除路徑的建議,git刪除路徑,刪除.gitmodules,從.git/config刪除條目,添加子模塊,然後提交併推送更改。令人費解的是,當我做「git commit -a」時,它看起來沒有任何變化,所以我試着推動刪除,然後推動閱讀,使其看起來像一個變化。

經過一段時間,我意外地注意到,在刪除所有內容後,如果我運行了「git submodule update --init」,它有一個關於git應該不再提及的特定名稱的消息:子模塊鏈接到的存儲庫,而不是它正在檢查的路徑名。 Grepping表明這個引用是在.git/index中的。所以我運行「git rm --cached repo-name」,然後讀取模塊。當我這次提交時,提交消息包含一個正在刪除這個意外對象的更改。之後,它工作正常。

不知道發生了什麼,我猜測有人濫用git submodule命令,可能會顛倒參數。可能是我甚至...希望這可以幫助別人!

8

我試圖在我的回購新結賬時嘗試「git submodule init」後,發生此錯誤。原來,我最初指定了具有錯誤大小寫的模塊子文件夾。由於我在Mac上使用區分大小寫的文件系統(hurr),因此它失敗了。例如:

git submodule add [email protected]:user/project.git MyApp/Resources/Project 
Cloning into 'MyApp/Resources/Project' 

成功,但麻煩的是,在磁盤上的路徑是

Myapp/Resources/Project 

我不明白的是爲什麼Git是init'ing模塊到錯誤的文件夾(忽略不正確的在我的命令案件),但隨後正確(通過失敗)與後續命令。

+0

同樣在這裏(Windows),雖然我不明白爲什麼。您應該可以自由地爲結帳指定具有不同外殼的文件夾,並且這不應更改模塊名稱。 – 2015-05-06 16:12:14

308

沒有在.gitmodules發現路徑子模塊映射 'OtherLibrary/MKStore' 時

​​

我不知道爲什麼發生錯誤。花了一分鐘後,在stackoverflow中找到了答案。

$ git rm --cached OtherLibrary/MKStore 

然後再次更新子模塊。它工作正常。

http://en.saturngod.net/no-submodule-mapping-found-in-gitmodules

+1

它編輯.gitmodules文件以改變https://鏈接通過git://鏈接 – Diwann 2013-06-18 12:24:05

+1

它也適用於我爲我工作,但我必須確保在子模塊路徑的末尾沒有斜線。 – peter 2014-03-27 16:45:01

+0

我不敢相信我忘記了init選項。如果你克隆一個項目,應該在啓動子模塊之前更新它們。 – alex 2015-04-20 13:46:38

3

只是git rm subdir都會好的。這將刪除作爲索引的子目錄。

3

方案:改變從目錄DIRA-XXX子模塊到另一個目錄DIRB-XXX

  1. 招DIRA-XXX來DIRB-XXX
  2. 修改.gitmodules入門使用DIRB-XXX
  3. 修改的.git條目/配置以使用DIRB-XXX
  4. 修改的.git /模塊/ DIRA-XXX /配置以反映正確的目錄
  5. 修改DIRA-XXX/git的以反映正確的目錄
  6. 運行git submodule status

    如果返回錯誤:沒有在.gitmodules的路徑迪拉-XXX發現子模塊映射。這是由於dirA-xxx不存在,但它仍然被git跟蹤。更新git索引:git rm --cached dirA-xxx

    嘗試使用git submodule foreach git pull。 我沒有經過git submodule結構的實際研究,所以上面的步驟可能會破壞一些東西。儘管如此,通過上述步驟,目前情況看起來不錯。如果您有任何見解或適當的步驟來完成任務,請在此分享。 :)

14

當我使用SourceTree做的東西,它會吐出這條消息。
我遇到的消息:

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree submodule update --init --recursive 
No submodule mapping found in .gitmodules for path 'SampleProject/SampleProject' 
Completed with errors, see above 

我的情況是我誤用項目目錄中包含git的文件夾。
SourceTree將此文件夾視爲git子模塊,但實際上並非如此。

我的解決方案是使用命令行將其刪除。

$ git rm -r SampleProject --cached 
$ git commit -m "clean up folders" 

刪除git中的垃圾並保持清潔。

+1

是的,刪除緩存的子模塊文件夾將工作。 – liaogang 2015-09-16 07:00:51

1

通常,蠢貨,項目的根目錄(git的/)

當你在一個CMS的工作,它可能在安裝模塊/插件攜帶的.git /目錄中的git對元數據創建了一個隱藏目錄特定的模塊/插件

最快的解決方案是找到所有.git目錄並只保留您的根git元數據目錄。如果你這樣做,git不會將這些模塊視爲項目子模塊。

2

文件中.gitmodules,我換成串

"path = thirdsrc\boost" 

"path = thirdsrc/boost", 

,它解決了! - -

+0

感謝解決了我的問題。可能是Windows中出現的問題。在我的情況下路徑是「path = something \\ folder」 – 2016-01-31 18:55:57

1

看着我的.gitsubmodules後,事實證明我確實有一個大寫字母,我不應該有。所以請記住,在.gitsubmodules目錄是區分大小寫

4

文件夾映射可以在.git/modules文件夾(每個人都有config文件,參照其worktree)被發現,所以一定要確保這些文件夾對應配置.gitmodules.git/config

所以.gitmodules具有正確的路徑:

[submodule "<path>"] 
    path = <path> 
    url = [email protected]:foo/bar.git 

,並在[core]部分.git/modules/<path>/config你已經在正確的道路,以你的<path>,例如

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    worktree = ../../../<path> 

如果.git/modules正確的文件夾丟失,那麼你去你的子模塊目錄並嘗試git reset HEAD --hardgit checkout master -f。如果這不起作用,那麼您可能希望刪除對已損壞的子模塊的所有引用並重新添加它,然後請參閱:Rename a git submodule

0

在我的情況下,錯誤可能是由於具有不同子模塊配置的兩個分支上的.gitmodules之間的錯誤合併。 從這個論壇採取建議後,我解決了手動編輯.gitmodules文件的問題,添加缺少的子模塊條目非常簡單。之後,命令 git子模塊更新--init - 遞歸 沒有問題。

0

我們的問題是重複的子模塊條目已被添加到.gitmodules(可能來自合併)。我們在.gitmodules中搜索了git抱怨的路徑,並找到了兩個相同的部分。刪除其中一個部分解決了我們的問題。

值得一提的是,git 1.7.1給出了「no submodule mapping」錯誤,但git 2.13.0似乎並不在意。