当我结账主人时,git子模块有“新提交”

时间:2015-04-28 20:34:27

标签: git git-submodules

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

 modified:   Helpers (new commits)

为什么认为有新的提交?子模块应该仍然与更新时相同(在这种情况下,克隆),不是吗?

2 个答案:

答案 0 :(得分:3)

可能发生的事情是您的子模块holding/ $ git submodule update 不是您持有的回购所需的版本。

将子模块设置为持有仓库所需的版本:

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

检查子模块所需的SHA1:

master

检查您的子模块的holding/ $ cd sub holding/sub $ git checkout master holding/sub $ git log -1 # (2) 是什么:

SHA1

{2}处的SHA1是否与您在(1)处看到的相同?如果没有,那就是你的问题。在子模块的主人身上发生了一些事情,但这些新的变化并未包含在持有回购中。

持有仓库保留master作为对要使用的子模块版本的引用。如果在子模块的repo中进一步开发,则hold repo仍然保持相同的版本,它不会自动更新子模块。

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

如果要继续处理子模块,请从保留仓库所需的版本开始,您需要创建一个新分支。 master反映了子模块的回购中的进一步发展,所以要么你从master工作(并包括这个进一步的开发和你的新工作),要么你从独立的头部创建一个新的分支持有是指。

如果要强制master在保持所需的分离头上,那么在分离头和master之间创建的提交(进一步开发)会发生什么?他们会迷路。下次将您移动的origin推送到master会发生什么?由于您的本地origin会与{{1}}分歧,因此会发生冲突。

答案 1 :(得分:0)

如果您的子模块的HEAD与父存储库的索引中指定的提交不匹配,那么git将为您提供&#34; new commit&#34;信息。您可以通过运行git ls-tree

来检查索引中指定的提交
$ git ls-tree master:<path_to_folder_containing_my_submodule>
160000 commit ba9d11670daf5109a52e5a2b01bca8a344897338  my_submodule

当你执行递归git clone时,git将获取最新的git,然后将HEAD指向指定的commit。如果指定的提交与远程主服务器中的最新提交不匹配,则克隆时master将不等于HEAD

执行递归克隆后检查的另一种方法是cd进入子模块,然后使用git log

$ git log --decorate --all
commit 6a75034cc78fc637e2437bba9f5834835f56bd8f (origin/master, origin/HEAD, master)
...
commit ba9d11670daf5109a52e5a2b01bca8a344897338 (HEAD)

如果HEADmaster指向相同的提交,那么您可以结帐主人,而您将看不到&#34;新提交&#34;父回购中的消息。