c++ - 将 git commit 和 git diff 作为字符串放入二进制文件中?

标签 c++ git

我是一名研究生,我的主要研究领域是软件模拟。我有一些用于生成结果的 C++ 代码,但我的大问题是,为了争取可重现性,我想在我的二进制文件中保存足够的元数据,以便我可以返回到生成该二进制文件的确切源代码(主要是为了查看我发现的某些错误是否使我之前生成的某些结果无效)。

换句话说,当我生成一组输出文件时,我希望二进制文件转储当前修订版的 git 提交以及任何未完成的更改。这将允许我(理论上)检查该提交,应用保存的补丁,并返回到创建二进制文件的确切源代码。

我知道我可以通过手动保存信息或其他方式在带外执行此操作,但为了确保完全一致,我想直接将信息烘焙到二进制文件中,这样每个二进制文件都可以追溯到它的确切来源。

我很熟悉在 makefile 中设置 #define 标志来存储类似 git commit SHA1 的东西,但我想我需要某种更聪明的方法来将整个 git diff 作为字符串存储在二进制。

所以我有几个问题:

  1. 这是个糟糕的主意吗?是否有更好的方法来追溯二进制文件的源代码?
  2. 实现此目标的最佳方法是什么?

谢谢。

编辑:我想我没有说清楚我想要保存差异的原因是为了捕获当前 HEAD 之上的任何未提交更改。我可以存储散列,但如果我错误地使用了包含一些未提交内容的二进制文件,那么我将无法取回正确的源。

最佳答案

在你的代码中保存 git “id” 数字(散列)是个不错的主意。保存差异是毫无意义的,因为散列(连同它来自哪个分支)应该允许您返回到原始代码。

只需确保您的构建和测试系统已设置为您不能使用尚未提交的内容,这样您就无法进行一些未在构建中提交的随机更改。

编辑: 在你的机器上,在项目的本地拷贝中进行测试,和使用检查一切的测试套件进行测试是有区别的——这是你用来确认一切正常的东西,对吧?请注意,在其他人获得该代码的拷贝之前,您测试的内容并不重要 - 在提交之前不要让其他人看到您的代码,并且不允许保存测试的完整测试套件发行说明等的结果,如果你还没有提交所有内容 [或者更好的是,有一个单独的目录/机器,它只从中央仓库获取新代码——如果你这样做,那么你不可能使用未提交的代码。

我已经完成了几个以这种方式工作的项目 - 您可以使用未提交的代码在本地目录中构建,但所有“官方构建”都是在不同的机器上完成的,代码总是直接来自 repo,没有本地更改。

如果您没有两台机器,也许有一个虚拟机“就像一台单独的机器”,或者只使用您用于“官方测试”的第二个目录[或不同的用户?]。

实际上,您可以简单地检查是否存在一些差异,然后在“这是散列”的同时添加,如果有任何差异,则添加额外的“-with-uncommitted-changes”或类似内容。您可以使用 git diff --exit-code 为“无更改”或“更改”提供 0 或 1 退出代码。

关于c++ - 将 git commit 和 git diff 作为字符串放入二进制文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131753/

相关文章:

c++ - OpenCV FAST 检测器

c++ - 如何将成员函数指针传递给 std::function

database - Hook 以在 git pull 上创建/添加数据库转储文件到存储库

git - Git中分支的两次提交之间的变化汇总

c++ - 将 n 个二进制调用转换为 C++ 中的一个 n 元调用?

c++ - 错误代码 = 0x80070002(MS Visual Studio)C++

git - 如何 git grep 只有一组文件扩展名

git - 按规则分支时主分支的用途

c++ - 带有 Qt 的动态 QGridLayout(适应小部件大小)

git - 如果我没有在 `git checkout [commit]` 末尾添加一个点会发生什么?