2

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

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

这是 2011 年 11 月 26 日的违规提交:http:
//gitweb.dragonflybsd.org/dragonfly.git/commitdiff/86d7f5d305c6adaa56ff4582ece9859d73106103
https://github.com/DragonFlyBSD/DragonFlyBSD/commit/86d7f5d305c6adaa56ff4562ece939

从那时起,使用一些工具,如果您查看存储库中任何文件的文件历史记录,您可以看到它在 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 时间是假的,请注意文件是如何被 dd 的A而从未被删除,并且dstsha1 是相同的。另一个更具代表性的例子,它表明srcsha1 总是0000000...在这样的虚假提交中,尽管当你考虑到该文件从未被删除并且仍然具有相同的dstsha1 时它几乎没有意义:

    % 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
    
  • http://gitweb.dragonflybsd.org/dragonfly.git/history/HEAD:/sys/sys/sensors.h

我的问题如下:

  • 如何在不首先删除文件的情况下添加文件?允许这样的事情是/是git中的一个错误吗?

  • 为什么有些工具会压缩此类虚假提交(并向用户隐藏它们),而有些工具却没有?

  • 有没有办法在实际上没有修改的文件上进行git-whatchangedgitweb忽略此类虚假提交,就像git-log这样github做一样?

4

1 回答 1

2

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

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

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

git log过滤掉这个提交,因为它不是合并点的第一个父级。我不知道导致git log相信首先有一些东西可以忽略的逻辑。

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

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

于 2013-01-31T23:24:51.223 回答