我有个子模块叫做助手。当我用--递归克隆我的主项目时,Helpers子模块处于分离的head状态(正如所有教程所说的那样)。如果我现在在主项目目录中'git状态‘,一切都是干净的。如果我'cd助手;git结帐大师‘,我期望什么都不会改变,除了我现在在一个命名的分支,我可以承诺。然而,如果我没有做任何其他事情,如果我'cd .;git状态‘,我看到
modified: Helpers (new commits)为什么它认为有新的提交?子模块应该仍然与更新时相同(在本例中是克隆的),不是吗?
发布于 2015-04-28 21:48:06
如果子模块的HEAD与父存储库索引中指定的提交不匹配,那么git将给出“新提交”消息。可以通过运行git ls-tree来检查索引中指定了哪些提交。
$ git ls-tree master:<path_to_folder_containing_my_submodule>
160000 commit ba9d11670daf5109a52e5a2b01bca8a344897338 my_submodule当您执行递归的git克隆时,git将获取最新的git,然后将HEAD指向指定的提交。如果指定的提交与远程主服务器中的最新提交不匹配,那么当您克隆时,master将不等于HEAD。
执行递归克隆后检查的另一种方法是将cd放入子模块,然后使用git log。
$ git log --decorate --all
commit 6a75034cc78fc637e2437bba9f5834835f56bd8f (origin/master, origin/HEAD, master)
...
commit ba9d11670daf5109a52e5a2b01bca8a344897338 (HEAD)如果HEAD和master指向相同的提交,那么您可以签出主服务器,并且不会在父回购中看到“新提交”消息。
发布于 2015-04-29 11:20:24
可能发生的情况是,您的子模块的master并不是您持有的回购公司想要的版本。
将您的子模块设置为持有回购所需的版本:
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)看到的一样吗?如果不是,那就是你的问题了。子模块的主模块中发生了一些事情,但是这些新的更改没有包含在持有回购中。
持有回购保留一个SHA1作为对要使用的子模块版本的引用。如果在子模块的回购中发生进一步的开发,持有回购仍然保持相同的版本,它不会自动更新子模块。
如果您签出子模块的更新版本(如master),然后返回持有回购,git status会告诉您您已经在子模块中签出了一个新的提交。当前子模块提交的此更改可以在您的持有回购中执行。这将更新子模块的哪个版本将与这个提交保持一起使用。
如果您想继续对子模块工作,从持有回购想要的版本,您将需要创建一个新的分支。master反映了子模块的回购中的进一步发展,所以要么您从master工作(并包括这个进一步的开发和您的新工作),要么您从所指的分离头创建一个新的分支。
如果要将master强制放置在所需的分离头上,那么在分离的头和master之间创建的提交(进一步的dev)会发生什么呢?他们会迷路的。如果你下次把移动的master推到origin上,会发生什么呢?这将是一场冲突,因为您所在的本地master可能与origin不同。
https://stackoverflow.com/questions/29929396
复制相似问题