【问题标题】:Specifying Git commit hash指定 Git 提交哈希
【发布时间】:2018-06-21 22:15:18
【问题描述】:

我可以指定 Git 提交哈希,而不是让 Git 生成它吗?

有可能吗?我在 Git 文档或网上都没有找到任何方法。


对于一些背景知识:我正在以编程方式从私有存储库重新创建一个新的 Git 公共存储库。我需要对每个提交进行大量更改以删除机密信息。但我想保留提交 ID。

【问题讨论】:

  • 要补充所有答案,请考虑一下 - 根据定义,任意标识符不能是哈希值。

标签: git


【解决方案1】:

git commit hash 是一个加密校验和,它是根据你的存储库的状态计算出来的,包括存储库中所有文件的哈希、上一次提交的哈希、当前日期和时间等。

无法手动指定。

更多信息,请参阅this question

【讨论】:

    【解决方案2】:

    您可以使用git cat-file -p da500aa4f54cbf8f3eb47a1dc2c136715c9197b9 获得的提交内容(匿名;))(替换为您的一个提交的sha1):

    tree 48038c4d189536a0862a2c20ed832dc34bd1c8b2
    parent f0bb5942f47193d153a205dc089cbbf38299dd1a
    author Firstname Lastname <my@mail.com> 1513256382 +0100
    committer Firstname Lastname <my@mail.com> 1515152927 +0100
    
    This is a commit message
    

    如果这些数据之一发生变化,则所有 sha1 都会发生变化

    • tree 是根据文件内容和目录内容计算得出的 sha1。

    • Parent 是父提交哈希。

    • 注意里面也有日期,所以如果你在不同的时刻做了完全相同的提交,sha1也会改变

    PS:您可以继续使用命令git cat-file -p 继续探索tree 并更好地了解git 存储数据的方式。

    【讨论】:

    • da500aa4f54cbf8f3eb47a1dc2c136715c9197b9 是什么?
    【解决方案3】:

    我确实相信这是可能的,尽管这需要一些时间和工作,而且是一种 hack。 确实,哈希是由以下值生成的:

    • 内容
    • 提交日期
    • 之前提交的 ID
    • ...

    但是,如果您可以牺牲其中一个值的一致性,则可以做到。 这是一个例子:https://github.com/vog/beautify_git_hash
    它是一个脚本,它进行提交,然后寻找一个特定日期以使 git hash 成为您正在寻找的日期,然后对该日期进行修改。

    【讨论】:

      【解决方案4】:

      如果您对提交进行更改,ID 将会更改。(它们取决于提交内容本身,以及其中的更改)。

      所以,不。

      【讨论】:

      • 这里的“提交内容”是指元数据,例如日期、作者姓名等。因此,即使您执行 git commit --amend --reset-author 之类的操作,它也会更改作者和 ID。跨度>
      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 2018-09-22
      • 2012-12-31
      • 2021-02-04
      • 2021-06-13
      • 2012-02-06
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多