git filter-branch
)已完成的存储库并且可以访问git reflog
,否则您将无法审计此类更改。重写完成后,通常会强制推送到远程仓库(git push --force
),但是在那里,没有人可以追踪谁做了这个强制推送(因此需要测谎仪)。
(除非你有像gitolite这样的访问控制级别(ACL)管理系统,它自带审计跟踪功能)
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
$ 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
在你自己的存储库中,你可以做任何想做的事情。除非他们允许,否则你不能让任何其他人的存储库做任何事情。由于Git的操作方式和“因为数学”,特别是加密哈希函数背后的数学,即使你能构造伪造品,也没有其他存储库会看到它,更不用说查看或接受它了。
对于处理意外的强制推送等问题,Git附带了文档和示例,说明如何在默认的hooks
目录中配置日志记录、限制和各种其他工作流程定制。
对于配置了最简单预防措施的存储库,一个可执行文件
#!/bin/sh
cat >>info/receives
hooks/post-receive
中,对于你的问题,答案是“不”。