我有一个名为 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 移动时会发生什么 master
至 origin
?由于您的本地 master
会发生冲突会偏离 origin
的。
关于当我 checkout master 时,git 子模块有 "new commits",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929396/