我是研究生,我的主要研究领域是软件模拟。我有一些C ++代码用于生成结果,但我的大问题是,为了争取可重复性,我想在我的二进制文件中保存足够的元数据,以便我可以回到生成该二进制文件的确切源代码(主要是为了看看我发现的一些错误是否使我之前生成的某些结果无效)。
换句话说,当我生成一组输出文件时,我希望二进制文件既可以转储当前版本的git提交,也可以转储所有未完成的更改。这将允许我(理论上)检查该提交,应用保存的补丁,并返回创建二进制文件的确切源代码。
我知道我可以通过手动保存信息或其他东西来进行带外操作,但为了确保完全一致,我想直接将信息烘焙到二进制文件中,以便每个二进制文件都可以追溯到它的确切来源。
我很熟悉在makefile中设置#define标志来存储类似git commit SHA1的东西,但我认为我需要某种更聪明的方法将整个git diff存储为字符串。二进制的。
所以我有几个问题:
感谢。
编辑:我想我没有说明我想要保存差异的原因是在当前HEAD之上捕获任何未提交的更改。我可以存储哈希值,但是如果我错误地使用包含一些未提交内容的二进制文件,那么我就无法找回正确的源代码。
答案 0 :(得分:3)
在代码中保存git“id”数字(哈希)并不是一个坏主意。保存差异是没有意义的,因为哈希(以及它来自哪个分支)应该允许你回到原始代码。
只需确保您的构建和测试系统已设置为不能使用尚未提交的内容,这样您就无法进行一些未在构建中提交的随机更改。
编辑: 在您的机器上进行测试,在项目的本地副本中进行测试,并使用检查所有内容的测试套件进行测试之间存在差异 - 这是您用来确认一切正常的方法,对吗?请注意,在其他人获得该代码的副本之前,测试的内容并不重要 - 在其提交之前不要让其他人看到您的代码,并且不允许完整的测试套件保存测试发布说明等的结果,如果你没有提交所有内容[或更好,有一个单独的目录/机器,只能从中央仓库获取新代码 - 如果你这样做,那么你不可能使用未提交的代码。
我已经开发了几个以这种方式工作的项目 - 你可以使用未提交的代码在你的本地目录中构建,但所有“官方构建”都在不同的机器上完成,代码总是直接来自repo,没有本地更改。
如果您没有两台计算机,可能只有一台虚拟机“就像一台独立的计算机”,或者仅使用您用于“官方测试”的第二个目录[或不同的用户?]。
实际上,您可以简单地检查是否存在一些差异,然后与您的“这是哈希”一起,如果存在任何差异,请添加额外的“-with-uncommitted-changes”或类似的东西。您可以使用git diff --exit-code
为“无变更”或“更改”提供0或1退出代码。
答案 1 :(得分:2)
答案 2 :(得分:2)
从技术角度来看,存储git SHA1 id对于您想要实现的目标是公平的。
未提交的更改?如果存在,则将构建过程设置为失败 如果构建工程太难/太多工作,只需显示更多的纪律。 :)
编辑:
通过一个shellcript构建。在构建检查更改之前,git diff --exit-code
可能有所帮助。
编辑2:
如果您必须调试许多代码修订版,git help bisect
可以派上用场。
答案 3 :(得分:2)
我认为最好的答案是“不要这样做”。如果您需要可重复的构建,则仅针对已提交的更改进行构建,而不是使用脏工作目录。如果你需要,可以在一个侧面分支上提交实验性的东西,如果它不能解决你可以扔掉,或者可能把它留在你的存储库中(例如你的重复构建的用例),但放弃那个分支和工作在另一个新的分支。如果您只想要返回构建的特定点,请考虑在这些特定提交上删除适当的标记。