【问题标题】:Is it possible to completely alter git timestamp of files in a repository?是否可以完全更改存储库中文件的 git 时间戳?
【发布时间】:2016-02-05 04:58:52
【问题描述】:

我试图弄清楚一个 git 版本控制的文本文件存储库在理论上是否可以作为知识产权目的的纸质实验室笔记本替代品。

在纸质笔记本中,它的工作方式是您每天写下您的结果,然后实验室中的一两个人在笔记上签字并划掉所有空白处。从理论上讲,这应该表明您对当天所做的事情有一个完美的记录,并且您不能在日期之后添加任何内容。

我认为这可以在 git 中实现的方式是通过将实验结果(即实验室笔记本)推送到 github 上的私有共享 repo 的 repo,并且......不知何故另外两个人检查了在上面? (关于如何执行此操作的建议?)

主要需要注意的是,(如果是,运行所需的代码是什么)可以完全更改特定文本文件的内容和时间戳 - 而不会在整体提交历史?

【问题讨论】:

  • 我正在努力解决的要求是从一个提交到下一个提交的所有数据的持久性。通常,Git 允许在提交中修改文件的任何部分,因此审阅者可以有意或无意地删除实验数据。
  • 换句话说,来自实验室笔记本的页面实际上具有来自几个“提交”(发起者、审阅者和修改)的状态,而在 Git 中,单个提交代表一个页面处于单一状态。
  • @TimBiegeleisen 我对你的问题有点困惑。因此,在一个完美的世界中(理论上在当前的纸质世界中),一个实验室笔记本每天都有一个由发起者提交的内容。审阅者只需用他们的签名确认时间戳即可。
  • @TimBiegeleisen 在一个数字化的、更合理的世界里,我想做的就是对大多数笔记遵循提交确认模式,但在我犯了错误的情况下(或者可能没有澄清了有关我的实验设置的所有内容)我可以编辑该特定日期的文件,然后让审阅者再次确认新的时间戳,即当天的时间戳。
  • 看看下面给出的答案。 Git 可能可以模拟实验室笔记本的行为方式,但每次提交不一定包含实验室中发生的事情的完整历史记录。相反,您必须查看提交组才能实现这一目标。

标签: git version-control reproducible-research


【解决方案1】:

每个 git 提交都包含一个指向上一个 git 提交的链接(请参阅 Git Internal - Commit Objects。如果您更改了过去的提交,那么您将更改之后的每个提交。这会在您推送更新的提交时导致问题。

所以在 git 中重写历史是可能的。但是,通过适当设置的 git 服务器,您应该对无法更改历史记录有一定的信心。类似this question

【讨论】:

    【解决方案2】:

    你的目标确实是可能的,它最多和 SHA-1 本身一样安全。

    实现这一点的方法是通过数字签名(可能通过带注释的标签)充当签名者对特定 SHA-1 ID 的背书。该 SHA-1 将是最近更新提交的 SHA-1,它(通过 git 通常的提交 ID 的 Merkle 树)也自动覆盖所有以前的 SHA-1(除非每天单独存储,否则这并不重要)。

    通常带注释的标签签名使用 GPG 密钥,这可能比 SHA-1 本身更安全。 SHA-1 最初旨在抵抗所谓的第二个原像(基本上这意味着攻击者知道原始消息签名;然后攻击者提出第二条具有相同数字签名的不同消息)。不过,一些攻击方法是在 2005 年发现的,并且截至 2014 年,SHA-1 已被取消用于美国联邦数字签名目的的认证。

    在任何情况下都不需要使用 git:您可以简单地让您的验证者为每天的文件存储签名。签名本身可以随心所欲地存储(也许通过 git);它们独立于任何版本控制。不过,使用 SHA-256 或更强大的东西可能是明智的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多