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 log sys/sys/sensors.h
https://github.com/DragonFlyBSD/DragonFlyBSD/commits/master/sys/sys/sensors.h
但是,伪造的提交会被错误地显示,其中包含以下内容:
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
忽略对未经实际修改的文件进行此类虚假提交,就像gitweb
和git-log
一样
答案 0 :(得分:2)
我查看了有问题的提交并找到答案:
这是一个“root commit” - 它没有任何父母。通常,具有此属性的repo中的唯一提交是第一次提交。
因此,此提交中的每个文件都是新的,因为不存在旧版本。
git log
过滤掉此提交,因为它不是合并点的第一个父级。我不知道导致git log
认为首先要忽略某些事情的逻辑。
不,没有办法让其他工具忽略这样的提交,因为他们只是在做他们的工作。
这里出了什么问题,这个提交永远不应该在没有父项的情况下创建,如果有人创建这样的提交,它就不应该在任何地方合并。