您是不是忽略 .gitignore 中的 git 子模块或将其提交到您的仓库?

Posted

技术标签:

【中文标题】您是不是忽略 .gitignore 中的 git 子模块或将其提交到您的仓库?【英文标题】:Do you ignore a git submodule in your .gitignore or commit it to your repo?您是否忽略 .gitignore 中的 git 子模块或将其提交到您的仓库? 【发布时间】:2011-12-16 06:08:40 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

不,您不需要将您的子模块添加到您的.gitignore:父级将从您的子模块中看到的是 gitlink(special entry, mode 160000)。

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

您可以在“git submodule update (true nature of submodules)”中阅读有关该政策的更多信息。 子模块背后的主要思想是component-based approach,您可以在其中引用特定提交的其他存储库。但是,如果您更改了这些子模块中的任何内容,则还需要更新父 repo 中的这些引用。


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

git config submodule.<name>.active false

在“Ignore new commits for git submodule”查看更多信息。


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

见Johannes Schindelin (dscho)commit fadb482(2017 年 10 月 25 日)。(由 commit da7996a 中的Junio C Hamano -- gitster -- 合并,2017 年 11 月 6 日)

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

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

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

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

【讨论】:

这个答案令人困惑,因为问题标题询问是否忽略子模块文件夹,而您在问题正文后面对单独的问题回答是。 我认为它现在更有意义,并且提供了一些非常有用的深入信息。太棒了,感谢更新:) .gitignore 的参数:为什么在 .gitsubmodules 文件中包含的 url 可能包含带有用户名参数的用户特定 git url 时签入? @djangofan 问题(和我的回答)是关于忽略子模块 folder 本身(由 gitlink 表示的那个)。不是忽略.gitmodules 文件。确实,这个文件(.gitmodules)可能包含凭据,但如果仅用于克隆公共存储库,则不必包含它们。此外,即使在 Windows 上,它们也可以通过“Windows 的 Git 凭据管理器”(github.com/Microsoft/Git-Credential-Manager-for-Windows/…) 之类的凭据助手进行缓存。因此,在.gitmodules 中拥有凭据并不是致命的。【参考方案2】:

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

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

的原因
git config submodule.<your module path>.ignore all

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

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

【讨论】:

【参考方案3】:

要添加到已接受的答案,我发现将 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 但没有警告它正在相应地跳过子模块。

【讨论】:

以上是关于您是不是忽略 .gitignore 中的 git 子模块或将其提交到您的仓库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在idea中,忽略掉.gitignore文件自身,自己不能忽略自己,该怎么设置?

.gitignore

.gitignore 文件忽略自身

idea git提交文件忽略(.gitignore)

如何创建.gitignore文件,忽略git不必要提交的文件

Git 不会忽略 .gitignore 中的某些 Xcode 文件