你在.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
在一个gitignoredtracked/
的子模块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/