【发布时间】:2015-05-04 01:05:34
【问题描述】:
【问题讨论】:
【问题讨论】:
除非您有权访问已完成操作的存储库(通常是 git filter-branch),并且您可以访问 git reflog,否则您将无法审核此一种变化。
这意味着如果您克隆该存储库,则克隆没有该“重写”操作的痕迹。
即使您可以访问本地 repo 及其 reflog,该 reflog 也是有时间限制的:90 天后(默认情况下)其记录将被删除。
一旦在本地完成重写,它通常会被强制推送到远程仓库 (git push --force),并且再一次,没有任何痕迹表明是谁进行了强制推送 (hence the polygraph)。
(除非您有一些 ACL -- 访问控制级别 -- 管理系统,如 gitolite,它带有它的 own audit trail)
注意:要了解重写的“破坏性”性质,您需要了解Git object model 中的提交是如何构成的
作者和提交者字段实际上由一个名称和一个日期组成。
更改任何内容都会更改提交的 SHA1,以及引用该提交的任何其他对象的 SHA1。没有任何方式知道这个提交在某一时刻是不同的(除了 reflog,在本地完成修改)
来自this thread,使用git cat-file 和git hash-object:
$ git cat-file -p ee85b05
tree 32e5d1faecbc24b16e078ba42c1ab3e2c6515ab6
parent cef45cd0977f5f3f2baa5a5d2da857aff63ee50b
parent a5c89565fe6ceb7ebeef9794afb57415bd9bf099
author Mike Gerwitz <mikegerwitz@gnu.org> 1407466634 -0400
committer Mike Gerwitz <mikegerwitz@gnu.org> 1407466634 -0400
提交的哈希是从上述所有内容生成的:
(我这里省略了 GPG 签名和提交信息)
$ git cat-file -p ee85b05 | git hash-object --stdin -tcommit
ee85b058df783ffaa9f8d5ae58f9eb6d7586b0ca
您会注意到这正是标记中引用的哈希值。
如果我们稍微更改提交内容,我们会得到不同的哈希值:
$ cat <( git cat-file -p ee85b05 ) <( echo foo ) | git hash-object --stdin -tcommit
696a73618dd5d0d39f030d19ceab08c14115af4e
【讨论】:
您可以在自己的存储库中做任何您想做的事情。你不能让任何人else 的 repo 做任何事情,除非他们允许,因为 git 的运作方式和“因为数学”,特别是 cryptographic hash functions 背后的数学,即使你可以构造一个没有其他 repo 甚至会看到它的伪造品,更不用说查看或接受它了。
为了处理意外的强制推送等,Git 在默认的hooks 目录中提供了有关如何配置日志记录和限制以及所有其他工作流定制方式的文档和示例。
对于配置了即使是最简单的预防措施的存储库,可执行文件
#!/bin/sh
cat >>info/receives
在hooks/post-receive 中,您的问题的答案是“否”。
【讨论】: