你忽略.gitignore中的git子模块还是将它提交给你的repo?

spr*_*oft 78 git

project_dir/vendor/submodule_one每次运行时git status都会在项目中添加一个子模块modified: vendor/submodule_one (new commits).

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

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

刚刚开始使用子模块,除了设置它们之外似乎找不到太多信息.

Von*_*onC 67

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

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

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


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

git config submodule.<name>.active false
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅" 忽略git子模块的新提交 ".


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

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

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

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

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

因此,git status --ignored --untracked使用 submodulegitignored中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
Run Code Online (Sandbox Code Playgroud)

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

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

    tracked/submodule/
Run Code Online (Sandbox Code Playgroud)

  • 这个答案令人困惑,因为问题标题是询问是否忽略子模块文件夹,并且您在问题正文中稍后回答单独的问题. (6认同)
  • @SgtPooki好吧,我刚才写的新编辑会更清晰吗? (2认同)

小智 10

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

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

git config submodule.<your module path>.ignore all
Run Code Online (Sandbox Code Playgroud)

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

适用于(新提交)和(修改内容)消息。


Woo*_*odz 8

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

git submodule init
git submodule update
git pull --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

只有尝试重新运行

git submodule add <Git repo> <submodule folder>
Run Code Online (Sandbox Code Playgroud)

根据输出,很清楚问题是什么:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.
Run Code Online (Sandbox Code Playgroud)

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