我已经在project_dir/vendor/submodule_one
中为我的项目添加了一个子模块,现在每次运行git status
我都会modified: vendor/submodule_one (new commits)
。
我的问题是解决这个问题的最佳方法是什么?我是否将vendor/submodule_one
- 文件夹添加到.gitignore
,因为我的主要项目不需要知道我的子模块的具体内容?
或者当我更改并提交对子模块的更改时,我是否还需要在我的主项目中进行提交?
刚刚开始使用子模块,除了设置它们之外似乎找不到太多信息。
答案 0 :(得分:60)
不,您不需要将子模块添加到.gitignore
:父级将从您的子模块中看到的是 gitlink (a special entry, mode 160000
)。< / p>
这意味着:在子模块中直接进行的任何更改都需要在父目录中进行提交 这样,父目录将记录子模块状态的正确提交:该提交是上面提到的“gitlink”;
您可以在“git submodule update (true nature of submodules)”中详细了解该政策 子模块背后的主要思想是component-based approach,您可以在特定提交中引用其他存储库。但是,如果您更改这些子模块中的任何内容,则还需要更新父仓库中的这些引用。
请注意,使用Git 2.13(2017年第2季度),当不忽略gitlink时,您仍然可以忽略子模块:
git config submodule.<name>.active false
点击“Ignore new commits for git submodule”了解更多信息。
注意:使用Git 2.15.x / 2.16(2018年第一季度),忽略子模块更精确。
“git status --ignored --untracked
”并未停留在嵌入在被忽略的目录中的单独项目的工作树中,而是在其他项目中列出的文件,而不仅仅是将目录本身显示为忽略。
commit fadb482见Johannes Schindelin (dscho
)(2017年10月25日)
(Junio C Hamano -- gitster
--合并于commit da7996a,2017年11月6日)
status
:不要对排除目录中的子模块感到困惑我们谨慎地将
exclude
标记传递给treat_directory()
函数,以便我们可以指示其中的文件被排除而不是在递归时未跟踪。但我们还没有以同样的方式处理子模块。
因此,
git status --ignored --untracked
带有子模块 gitignoredsubmodule
中的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/
答案 1 :(得分:1)
由于某些原因 submodule.module-name.active 对我不起作用。
这就是为什么我使用 submodule.module-name.ignore
git config submodule.<your module path>.ignore all
https://git-scm.com/docs/gitmodules-在这里您可以找到参数的可能值的说明
为我工作,以获取(新提交)和(修改的内容)消息。
答案 2 :(得分: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可能存在一个错误,但并没有警告它会相应地跳过子模块。