你在.gitignore中忽略了一个git子模块还是把它提交给你的repo?

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

我的问题是最好的办法来处理这个? 我是否将vendor/submodule_one _文件夹添加到我的.gitignore因为我的主项目不需要知道子模块的具体细节?

或者当我改变和提交更改到我的子模块时,我是否也需要在我的主项目中提交?

刚开始使用子模块,除了设置它们之外似乎无法find许多信息。

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

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

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


请注意,使用Git 2.13(2017年第2季度),虽然忽略gitlink,但您仍然可以忽略子模块:

 git config submodule.<name>.active false 

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


注意:使用Git 2.15.x / 2.16(Q1 2018),忽略子模块更为精确。
git status --ignored -u ”并没有停留在embedded在被忽略的目录中的独立项目的工作树上,而是在该项目中列出了文件,而不是仅仅将目录本身显示为被忽略。

请参阅由Johannes Schindelin( dscho ) 提交的fadb482 (2017年10月25日) 。
(由Junio C gitster合并- gitster – 承诺 2017年11月6日, da7996a )

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

我们精心地将exclude标志传递给了treat_directory()函数,以便我们可以指出在treat_directory() exclude其中的文件而不是跟踪。

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

正因为如此, git status --ignored --untracked在一个gitignored tracked/的子模块submodule中执行tracked/将显示“ 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/