为什么hg总是提交git子模块,即使它没有';你没变吗?

为什么hg总是提交git子模块,即使它没有';你没变吗?,git,version-control,mercurial,git-submodules,Git,Version Control,Mercurial,Git Submodules,我有一个hg存储库,它有一个hg子存储库,其中有一些git子模块。(我知道这听起来很疯狂,但它在谷歌代码中使用svn repos,在github中使用libs,在bitbucket中使用模块。我使用的是一群人免费提供的代码,我要他们抱怨他们关于版本控制的决定——我想要的是代码,对此我很感激) 关于此场景的一个小“树”: + hg repo + hg subrepo + git submodules 当我在hg子存储库中更改一个文件并提交时,它会提交所有git子模块,即使它们没有更改

我有一个hg存储库,它有一个hg子存储库,其中有一些git子模块。(我知道这听起来很疯狂,但它在谷歌代码中使用svn repos,在github中使用libs,在bitbucket中使用模块。我使用的是一群人免费提供的代码,我要他们抱怨他们关于版本控制的决定——我想要的是代码,对此我很感激)

关于此场景的一个小“树”:

+ hg repo
  + hg subrepo
    + git submodules
当我在hg子存储库中更改一个文件并提交时,它会提交所有git子模块,即使它们没有更改。我已经运行了
hg status
,它没有显示关于git子模块的任何信息,但是如果我提交:

committing subrepository SUBREPO
如果我只使用一个hg主回购协议和一堆git子模块,这就不会有太多问题。问题在于我在第一个hg存储库中进行更改时:现在,当我提交时,它在hg存储库和hg子存储库中提交,因为它总是提交git子模块。现在,我有一条注释,它只设计在第一个hg存储库中,在hg子存储库中也有相同的注释


我如何避免每次提交带有git子模块的hg repository/subrepository时,都会间歇提交subrepository SUBREPO?这是虫子吗?这是git设计吗(可能git存储库总是至少更改一个“状态”文件,或者在拉取后总是更改的类似文件?我对git没有太多经验…

即使没有得到任何东西的拉取也会影响git中的文件。。。更具体地说是
.git/FETCH\u HEAD
文件。我不记得hg/Mercurial在这里是怎么做的,但我怀疑同样的事情。在任何情况下,如果它是一个空的pull,那么文件本身不会改变,只会改变时间戳

您可以通过制作git/hg存储库的精确副本来验证这一点,然后只拉入一个。目录比较工具将向您显示更改的文件


如果我正确地记住了我的hg,那么
hg status
命令将不包括子存储库中的文件,因此您看到的行为是有意义的。

不知道这是否有帮助,但在第3.1节中,他们解释了子存储库应该如何布局


但我知道你在这个组织里没有发言权?你能重新组织你的层次结构吗?

+1对于我从来都不想经历的非常荒谬的场景,你是否尝试过
hg ci-X“hg superpo dir”
?@jmg:我没有尝试过,因为我想了解原因,而不仅仅是“排除”这些子模块。:)包含树中子模块引用的git repo(即.git目录)在哪里?@mschonaker:Hg可以将git子模块作为子repo(检查最新版本,从1.8开始)。正如我在“树”中所示,.git目录位于hg repository/hg subrepository/git sumodule/.git中。“即使是一个什么也得不到的拉取也会触及git中的文件……更具体地说是.git/FETCH_HEAD文件。”这正是我试图研究的内容。也许拥有git子模块的hg实现改变了这个文件。我要调试一下,看看能不能想出一个解决方案!谢谢