当我 checkout master 时,git 子模块有 "new commits"

标签 git git-submodules

我有一个名为 Helpers 的子模块。当我使用 --recursive 克隆我的主项目时,Helpers 子模块处于分离头状态(正如所有教程所说的那样)。如果我现在在主项目目录中“git status”,一切都是干净的。如果我'cd Helpers; git checkout master',除了我现在在一个我可以 promise 的命名分支上,我不希望有任何改变。但是,如果我不做任何其他事情,如果我 'cd ..; git status',我明白了

 modified:   Helpers (new commits)

为什么它认为有新的提交?子模块应该仍处于更新时的同一点(在本例中为克隆),不是吗?

最佳答案

可能发生的情况是您的子模块的 master不是您持有的 repo 协议(protocol)想要的版本。

将你的子模块设置为持有仓库想要的版本:

holding/ $ git submodule update

检查子模块所需的 SHA1:

holding/ $ git submodule        # (1)
<list of all submodules, with the desired SHA1>

检查你的子模块的 master是:

holding/ $ cd sub
holding/sub $ git checkout master
holding/sub $ git log -1     # (2)

SHA1在 (2) 处与您在 (1) 处看到的一样吗?如果没有,那是你的问题。子模块的 master 发生了一些变化,但是这些新的变化没有包含在 holding repo 中。

持有 repo 保留一个 SHA1作为要使用的子模块版本的引用。如果子模块的 repo 发生进一步的开发,持有的 repo 仍然保持相同的版本,它不会自动更新子模块。

如果您 checkout 子模块的较新版本(例如 master ),然后返回到持有仓库,git status会告诉你你已经在你的子模块中检查了一个新的提交。当前子模块提交的这个更改可以在您的持有存储库中提交。这将更新哪个版本的子模块将与此持有提交一起使用。


如果你想继续在子模块上工作,从 holding repo 想要的版本,你将需要创建一个新分支。 master反射(reflect)子模块 repo 的进一步发展,所以你要么从 master 开始工作(并包括此进一步开发和您的新工作),或者您从 holding 所指的独立头部创建一个新分支。

如果你强制master在保持所需的分离头上,在分离头和 master 之间创建的提交(进一步开发)会发生什么?他们会迷路的。下次你 push 移动时会发生什么 masterorigin ?由于您的本地 master 会发生冲突会偏离 origin的。

关于当我 checkout master 时,git 子模块有 "new commits",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929396/

相关文章:

windows - Git:如何仅共享存储库中选定的文件夹和文件以允许 2 个团队协作,但不共享整个代码库?

git - 我做了一个 git Reset HARD 来修复错误的提交,但现在我的分支落后了

java - grep 命令不适用于 git blame 文件和 git log 以进行修订

git - 跟踪主存储库中的文件,该文件在子模块中被忽略

git - 排除子项目提交 Git

Git 检查提交

linux - 无法在 .gitconfig 文件中添加(任何)全局 git 配置

git - 将上游设置为子模块(或如何将 GitHub 分支作为子模块包含在内)

ios - Jenkins 与 Git 和 XCode : cannot pull sub-sub-module?

jquery - github.com/jquery/jquery 作为 git 子模块