为什么git有时会显示文件被更改的时候?

时间:2013-01-31 18:41:14

标签: git git-commit gitweb

DragonFly BSD使用git作为其SCM,内核和整个用户空间都有一个存储库和分支。

在2011-11-26,有人做了一个提交,以某种方式触及了存储库中的每个文件,即使大多数文件根本没有更改。

这是2011-11-26的犯罪行为:
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/86d7f5d305c6adaa56ff4582ece9859d73106103
 https://github.com/DragonFlyBSD/DragonFlyBSD/commit/86d7f5d305c6adaa56ff4582ece9859d73106103

从那时起,使用某些工具,如果你查看repo中任何位置的任何文件的文件历史记录,你可以看到它在2011-11-26中随着该提交而被更改,但它只在某些工具中显示,并且没有在别人看来。

例如,使用以下工具伪造2011-11-26提交

但是,伪造的提交会被错误地显示,其中包含以下内容:

  • git whatchanged --pretty=%at sys/sys/sensors.h

    1322296064
    
    :000000 100644 0000000... 554cfc2... A  sys/sys/sensors.h
    1191329821
    
    :000000 100644 0000000... 554cfc2... A  sys/sys/sensors.h
    

    1322296064时间是虚假的时间,并注意文件是A dded而没有被删除,并且dst sha1是相同的。另一个更具代表性的例子,表明src sha1在这样的虚假提交中始终是0000000...,即使你认为文件从未被删除但仍然具有相同的{{1 sha1:

    dst
  • http://gitweb.dragonflybsd.org/dragonfly.git/history/HEAD:/sys/sys/sensors.h

我的问题如下:

  • 如何在不首先删除文件的情况下添加文件?是不是允许这样的东西在git中出错?

  • 为什么有些工具压缩这样的虚假提交(并将其隐藏起来),但有些工具没有?

  • 有没有办法让% git whatchanged --pretty=%at sys/sys/sysctl.h | head -9 1322296064 :000000 100644 0000000... 6659977... A sys/sys/sysctl.h 1296826445 :100644 100644 94b8d96... 6659977... M sys/sys/sysctl.h 1292413105 :100644 100644 8c9deaa... 94b8d96... M sys/sys/sysctl.h git-whatchanged忽略对未经实际修改的文件进行此类虚假提交,就像gitwebgit-log一样

1 个答案:

答案 0 :(得分:2)

我查看了有问题的提交并找到答案:

这是一个“root commit” - 它没有任何父母。通常,具有此属性的repo中的唯一提交是第一次提交。

因此,此提交中的每个文件都是新的,因为不存在旧版本。

git log过滤掉此提交,因为它不是合并点的第一个父级。我不知道导致git log认为首先要忽略某些事情的逻辑。

不,没有办法让其他工具忽略这样的提交,因为他们只是在做他们的工作。

这里出了什么问题,这个提交永远不应该在没有父项的情况下创建,如果有人创建这样的提交,它就不应该在任何地方合并。