Jub*_*uff 4 git git-rewrite-history
我已经阅读了有关更改旧提交的时间戳的问题.
我想知道的是:这种操作是破坏性的(即不留下任何痕迹),或者是否有可能发现某个操作是在存储库中完成的?如果是这样,我怎么能这样做?
谢谢
除非您git filter-branch可以访问已完成操作(通常是a )的repo ,以及可以访问的操作git reflog,否则您将无法审核此类更改.
这意味着如果您克隆该repo,则克隆没有"重写"操作的跟踪.
即使您可以访问本地仓库及其reflog,该reflog也是有时间限制的:90天后(默认情况下),其记录将被清除.
一旦重写在本地完成,它通常被强制推送到一个远程repo(git push --force),并且再次,没有任何人强制推送(因此是测谎仪).
(除非您有一些ACL - 访问控制级别 - 管理系统,如gitolite,它附带自己的审计跟踪)
注意:要理解重写的"破坏性",您需要了解如何在Git对象模型中构造提交

作者和提交者字段实际上由名称和日期组成.
更改任何内容都会更改提交的SHA1以及引用该提交的任何其他对象.没有任何方式可以知道这个提交在某一点上是不同的(除了reflog,在本地进行修改)
从这个线程,使用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
Run Code Online (Sandbox Code Playgroud)
从以上所有内容生成提交的哈希:
(我在这里省略了GPG签名和提交消息)
$ git cat-file -p ee85b05 | git hash-object --stdin -tcommit
ee85b058df783ffaa9f8d5ae58f9eb6d7586b0ca
Run Code Online (Sandbox Code Playgroud)
您会注意到这正是标记中引用的哈希值.
如果我们要稍微改变提交内容,我们会得到一个不同的哈希:
$ cat <( git cat-file -p ee85b05 ) <( echo foo ) | git hash-object --stdin -tcommit
696a73618dd5d0d39f030d19ceab08c14115af4e
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
536 次 |
| 最近记录: |