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

时间:2011-10-27 05:28:02

标签: git

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

我的问题是解决这个问题的最佳方法是什么?我是否将vendor/submodule_one - 文件夹添加到.gitignore,因为我的主要项目不需要知道我的子模块的具体内容?

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

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

3 个答案:

答案 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 fadb482Johannes Schindelin (dscho)(2017年10月25日) Junio C Hamano -- gitster --合并于commit da7996a,2017年11月6日)

  

status:不要对排除目录中的子模块感到困惑

     

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

     

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

     

因此,git status --ignored --untracked带有子模块   gitignored 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/

答案 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可能存在一个错误,但并没有警告它会相应地跳过子模块。