Do you ignore a git submodule in your .gitignore or commit it to your repo?

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

我的问题是怎么处理这件事最好?我添加 vendor/submodule_one文件夹到我的 .gitignore作为我的主要项目应该不需要知道我的子模块的细节?

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

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

77217 次浏览

不,您不需要将子模块添加到 .gitignore: 父模块将从子模块看到的是 Gitlink(特别条目,mode 160000)。

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

你可以在“ Git 子模块更新(子模块的真实性质)”中了解更多关于该政策的信息。
子模块背后的主要思想是 component-based approach,您可以在特定的提交中引用其他回购协议。但是,如果您更改了这些子模块中的任何内容,则还需要更新父回购中的这些引用。


注意,在使用 Git 2.13(2017年第二季度)时,虽然 没有忽略了 gitlink,但是您仍然可以使用以下命令忽略子模块:

git config submodule.<name>.active false

详情请看“ Ignore new commits for git submodule”。


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

提交 fadb482(2017年10月25日) by 约翰内斯 · 辛德林(dscho)
(由 朱尼奥 · C · 哈马诺 gitster于2017年11月6日在 commit da7996a合并)

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

我们小心翼翼地将 exclude标志传递给 treat_directory()函数,以便在递归时指示其中的文件被排除而不是取消跟踪。

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

因此,git status --ignored --untracked带有一个子模块 submodule in a gitignored tracked/ would show the submodule in the 「 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/

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

所以我用了 Module-name 忽略

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

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

对于(新的提交)和(修改的内容)消息,我可以使用。

To add onto the accepted answer, I have found that adding the Git submodule folder to .gitignore actually causes issues - particularly when trying to create a fresh clone of the project. Specifically, running the normal submodule clone commands resulted in the submodule folder being empty:

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,而是从中删除了 Git 子模块文件夹。Gitignore 并重新运行子模块克隆命令-现在已经成功地创建了文件夹。我认为其中一个子模块克隆命令可能存在 bug。但是没有警告它正在相应地跳过子模块。