您是不是忽略 .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
带有一个子模块 gitignoredtracked/
中的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文件自身,自己不能忽略自己,该怎么设置?