【问题标题】:Why my DLL files inside are being marked as modified in git?为什么我的 DLL 文件在 git 中被标记为已修改?
【发布时间】:2021-12-10 14:56:14
【问题描述】:

我需要在 git 中包含一些 DLL 文件。我知道这不是一个好习惯。但这个解决方案暂时解决了我们的一个问题。

但问题是,虽然我根本没有改变任何东西,也没有修改任何一行代码,甚至没有修改一个字符,但当我使用 dotnet build 时,我看到 git 将输出标记为 修改。

我尝试使用 Beyond Compare 的十六进制比较来比较它们,这是开始字节的图像:

我不知道为什么要修改它。我的意思是,我希望 dotnet build 具有确定性,并且对于相同的输入给我相同的结果。但显然有些事情发生了变化。

有人知道dotnet build为什么会有这种行为吗?

我正在使用 .NET 6。

【问题讨论】:

  • 我的猜测:它包括构建二进制文件的时间的时间戳。除非您有时光机,否则每次都应该不同。另请参阅this 以供参考
  • 你可能想看看reproducible builds
  • @FranzGleichmann 是正确的,时间戳存储在构建程序集的 PE Header 中。
  • Roslyn 支持deterministic builds
  • @KlausGütter:感谢您的链接。 .NET 编译器生成的 PE 文件的不确定性一直是个问题。我知道微软在很久以前就生产了一个工具,它可以对两个 PE 文件进行二进制比较,排除每次构建时更改的位。这在一些受监管的行业中是必不可少的。据我所知,它从未被广泛使用(您需要一份 Premier Support 合同和一个好奇的 TAM 或 ADC 才能获得访问权限)。很高兴知道这一点。谢谢!

标签: c# git .net-6.0


【解决方案1】:

让我总结一下 cmets,以便这里有一个答案(OP 应该已经这样做了):Git 说文件已修改,因为它实际上已修改。 有一个构建时间戳(在这种情况下,它只是一个时间戳;其他系统中的其他情况可能包括其他项目)导致构建不是 reproducibledeterministic

这是一个很常见的问题。有些系统有一个旋钮,你可以设置它来获得确定性的构建,而这个特定的系统就是这样做的。打开它解决了这个问题。请参阅Klaus Gütter's comment 中提供的the link

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2021-04-23
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多