您是否在.gitignore中忽略git子模块或将其提交到您的仓库中?


94

我在添加一个子模块到我的项目project_dir/vendor/submodule_one,现在我每次运行git status我得到modified: vendor/submodule_one (new commits)

我的问题是解决这个问题的最佳方法是什么?我是否将vendor/submodule_one-folder添加到我的.gitignore主项目中,因为我不需要知道子模块的详细信息?

或者,当我更改子模块并提交更改时,是否还需要在主项目中进行提交?

刚开始使用子模块,除了设置子模块外似乎找不到更多的信息。

Answers:


80

不,您不需要将子模块添加到.gitignore:父级将从子模块中看到的是gitlink特殊条目mode 160000)。

这意味着:直接在子模块中进行的任何更改都需要在父目录中进行提交。
这样,父目录将记录子模块状态的正确提交:该提交是上述的“ gitlink”;

您可以在“ git子模块更新(子模块的真实性质) ”中阅读有关该策略的更多信息。
子模块背后的主要思想是基于组件的方法,您可以在特定提交时引用其他存储库。但是,如果您更改了这些子模块中的任何内容,则还需要更新父存储库中的那些引用。


请注意,在Git 2.13(2017年第二季度)中,尽管忽略gitlink,您仍然可以使用以下命令忽略子模块:

git config submodule.<name>.active false

请参见“忽略git子模块的新提交”。


注意:对于Git 2.15.x / 2.16(Q1 2018),忽略子模块更为精确。
git status --ignored --untracked”并没有停留在一个单独项目的工作树中,该项目嵌入在被忽略的目录中并在该其他项目中列出了文件,而不仅仅是将目录本身显示为被忽略。

请参阅Johannes Schindelin()的commit fadb482(2017年10月25日(由Junio C Hamano合并--commit da7996a中,2017年11月6日)dscho
gitster

status:不要被排除目录中的子模块混淆

我们将exclude标志精心传递给treat_directory()函数,以便可以指示在递归时将其中的文件排除在外而不是未跟踪。

但是我们还没有以相同的方式对待子模块。

正因为如此,git status --ignored --untracked有一个子模块 submodule在gitignoredtracked/将显示辅助模块中的“中Untracked files”部分,例如:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

相反,我们希望它在“ Ignored files”部分显示子模块:

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
谢谢VonC,当您这样说时,这是非常有意义的。
sprysoft 2011年

7
该答案令人困惑,因为“问题”标题询问是否忽略子模块文件夹,并且您稍后在问题正文中回答是。
SgtPooki 2014年

1
我认为它现在变得更加有意义,并且正在提供一些非常有用的深入信息。
太棒了

.gitignore的参数:当其中包含的URL可能包含带有用户名参数的用户特定git url时,为什么要签入.gitsubmodules文件?
djangofan '16

1
@djangofan问题(和我的回答)是关于忽略子模块文件夹本身(一个由gitlink表示的文件夹)。与忽略.gitmodules文件无关。的确,该文件(.gitmodules)可能包含凭据,但是如果仅用于克隆公共存储库,则不必包含它们。此外,即使使用Windows,也可以使用“ Git Credential Manager for Windows”(github.com/Microsoft/Git-Credential-Manager-for-Windows/…)之类的凭据帮助程序来缓存它们,即使在Windows上也是如此。因此,拥有中的凭据.gitmodules并不是致命的。
VonC

8

由于某种原因submodule.module-name.active对我不起作用。

这就是为什么我使用submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules-在这里您可以找到参数可能值的描述

为我工作(新提交)和(修改内容)消息。


1

要添加到已接受的答案中,我发现将Git子模块文件夹添加到.gitignore实际上会引起问题-特别是在尝试创建项目的新克隆时。具体来说,运行常规子模块克隆命令会导致子模块文件夹为空:

git submodule init
git submodule update
git pull --recurse-submodules

只有尝试重新运行

git submodule add <Git repo> <submodule folder>

根据输出,很清楚问题出在哪里:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

-f我没有添加,而是从.gitignore中删除了Git子模块文件夹,然后重新运行了子模块克隆命令-现在可以成功创建该文件夹了。我认为子模块克隆命令之一尊重.gitignore可能存在一个错误,但没有警告它会相应地跳过子模块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.