是否可以在不留下痕迹的情况下重写历史记录?

时间:2015-03-03 11:35:36

标签: git git-rewrite-history

我已阅读this question有关更改旧提交的时间戳的信息。

我想知道的是:这种操作具有破坏性(即不留下任何痕迹),或者是否有可能发现存储库中已完成某项操作?如果是这样,我怎么能这样做?

由于

2 个答案:

答案 0 :(得分:7)

除非您可以访问已完成操作(通常为git filter-branch)操作的仓库,并且您可以访问 git reflog ,否则您将无法访问能够审计这种变化。

这意味着如果你克隆那个repo,那么克隆就没有那个"重写"操作

即使您有权访问本地仓库及其reflog,该reflog也是有时间限制的:90天后(默认情况下),其记录将被清除。

一旦在本地完成重写,它通常被强制推送到远程仓库(git push --force),并且再次,没有任何人强制推送(hence the polygraph)。登记/> (除非你有一些ACL - 访问控制级别 - 管理系统,如 gitolite ,它附带own audit trail


注意:了解"破坏性"重写的本质,您需要了解如何在Git object model

中构建提交

http://schacon.github.io/gitbook/assets/images/figure/object-commit.png

作者和提交者字段实际上由名称​​和组成的日期。

更改任何内容都会更改提交的SHA1以及引用该提交的任何其他对象。没有任何方式可以知道这个提交在某一点上是不同的(除了reflog,在本地进行修改)

来自this thread,使用git cat-filegit 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

答案 1 :(得分:0)

你可以在自己的回购中做任何你想做的事。除非他们允许,否则你不能让任何人别人的回复对任何事情做任何事情,并且因为git如何操作而且&#34;因为数学&#34;,具体而言cryptographic hash functions背后的数学,即使你可以构建一个伪造品,也没有其他的回购甚至可以看到它,更不用说看它或接受它了。

为了处理意外强制推送等,Git附带了有关如何在默认hooks目录中配置日志记录和限制以及各种其他工作流程定制的文档和示例。

对于使用最简单的预防措施配置的仓库,可执行文件

#!/bin/sh
cat >>info/receives

hooks/post-receive中,您问题的答案是&#34;否。&#34;

相关问题