【问题标题】:Is it possible to rewrite history without leaving trace?是否可以不留痕迹地改写历史?
【发布时间】:2015-05-04 01:05:34
【问题描述】:

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

我想知道的是:这种操作是破坏性的(即不留下任何痕迹)或者是否有可能发现对存储库进行了某个操作?如果是这样,我该怎么做?

谢谢

【问题讨论】:

    标签: git git-rewrite-history


    【解决方案1】:

    除非您有权访问已完成操作的存储库(通常是 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-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
    

    【讨论】:

    • 感谢您的详尽回答。所以,除非我放一些东西来跟踪对存储库所做的操作,否则我不能只用 Git 来跟踪它们,对吧?例如,你认为像 Bitbucket 这样的组织有这样的审计日志吗?我有一个我想检查的存储库。
    • BitBucket 有自己的审计跟踪机制:blog.bitbucket.org/2013/08/15/…,但它可能不包括 git 操作。 2013年我还提到了BitBucket的reflog (stackoverflow.com/a/15597710/6309)
    【解决方案2】:

    您可以在自己的存储库中做任何您想做的事情。你不能让任何人else 的 repo 做任何事情,除非他们允许,因为 git 的运作方式和“因为数学”,特别是 cryptographic hash functions 背后的数学,即使你可以构造一个没有其他 repo 甚至会看到它的伪造品,更不用说查看或接受它了。

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

    对于配置了即使是最简单的预防措施的存储库,可执行文件

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

    hooks/post-receive 中,您的问题的答案是“否”。

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 2011-01-31
      • 2016-04-27
      • 2011-09-09
      • 2013-05-01
      • 2013-09-20
      • 2013-09-07
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多