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

11 浏览
0 Comments

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

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

我的问题是如何处理这个问题?我应该将vendor/submodule_one文件夹添加到.gitignore中吗?因为我的主项目不需要知道子模块的具体信息。

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

刚刚开始使用子模块,似乎找不到除了设置子模块之外的其他信息。

0
0 Comments

你不需要将子模块添加到.gitignore文件中:父模块会以一个gitlink(一种特殊的条目,mode为160000)的形式看到子模块。这意味着:在子模块中直接进行的任何更改都需要在父目录中进行提交。这样,父目录将记录子模块状态的正确提交:该提交就是上述提到的gitlink。

子模块的主要思想是一种基于组件的方法,其中你可以在特定提交上引用其他仓库。但是,如果你在这些子模块中进行任何更改,你也需要在父仓库中更新这些引用。

注意,从Git 2.13开始(2017年第二季度),尽管没有将gitlink忽略掉,你仍然可以通过以下方式忽略子模块:

git config submodule..active false

更多信息请参见"忽略git子模块的新提交"。

需要注意的是,从Git 2.15.x/2.16开始(2018年第一季度),忽略子模块的方式更加精确。`git status --ignored --untracked`不再停留在被忽略的目录的工作树上,而是列出该目录中的文件,而不仅仅是显示被忽略的目录本身。

在这个问题中,某些情况下了将.gitmodules文件添加到.gitignore中的原因。这是因为.gitmodules文件中可能包含一个包含用户名参数的用户特定git URL。然而,这个问题(以及我的答案)是关于是否忽略子模块文件夹本身(用gitlink表示的文件夹)的问题,而不是忽略.gitmodules文件。.gitmodules文件确实可能包含凭据,但如果仅用于克隆公共仓库,它不必包含凭据。此外,它们可以在Windows上使用凭据助手(如"Git Credential Manager for Windows")进行缓存,所以在.gitmodules中存储凭据并不是必须的。

是否将git submodule添加到.gitignore中取决于你的实际需求和安全考虑。如果你希望子模块的更改自动跟踪并提交到父仓库中,那么不需要将其添加到.gitignore中。如果你希望忽略子模块的更改,可以通过配置命令来实现。

0
0 Comments

在这个问题中,出现的原因是将Git子模块文件夹添加到.gitignore文件中会导致问题,特别是在尝试创建项目的新克隆时。具体来说,运行常规的子模块克隆命令会导致子模块文件夹为空:

git submodule init
git submodule update
git pull --recurse-submodules

只有重新运行

git submodule add  

根据输出的结果,才能清楚地知道问题所在:

The following path is ignored by one of your .gitignore files:

Use -f if you really want to add it.

我删除了.gitignore中的Git子模块文件夹,并重新运行了子模块克隆命令,现在成功创建了该文件夹。我认为可能存在一个bug,即其中一个子模块克隆命令遵循了.gitignore,但没有相应地警告它跳过了一个子模块。

解决方法是从.gitignore中删除Git子模块文件夹,然后重新运行子模块克隆命令即可。

0