代码之家  ›  专栏  ›  技术社区  ›  Andrew Holmgren Amir

跨git提交调试可执行文件

  •  1
  • Andrew Holmgren Amir  · 技术社区  · 6 年前

    有没有人想出一个好的解决方案来使用git在不同代码版本之间调试可执行文件?基本上,我希望能够在我最近的一组提交和旧的一组提交之间生成并行的可执行文件,并跟踪相关代码,在提交之间跳转时不会覆盖所有内容。

    目前我的方法是生成/编译当前代码,重命名可执行文件,以及我试图在调试器中分析的任何代码(在我的例子中是gdb)。现在,对于旧代码,我喜欢在签出旧的commit之前签出一个新的分支,因为我有妄想症,它会构建reflog以提供额外的安全性和检查点(我知道这不是真的必要)。我签出旧代码,并在旧提交上运行make文件。现在我有了可以与gdb一起运行的并行可执行文件。不过,这一切都有点乏味,尤其是如果几个标题/文件已经更改(我喜欢分解代码),而且如果我现在想进行更改和重新编译(我有大量的引用/包含,基本上只需要重新开始这个过程)。有谁有更好的方法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Obsidian mattz608    6 年前

    我最近在调试/升级一个需要正确安装在系统上的库时遇到了类似的问题(使用 制作安装 )并在最后的稳定版本和开发版本之间进行跳跃。

    从2.6.0版(大约三年后)开始,您现在可以使用

    git worktree
    

    它基本上使您能够在任何地方将任何目录转换为官方git本地存储库的附件。它通过填充 .git textfile(而不是常规子目录)位于其顶层,包含指向原始子目录的信息。在存储库方面,此附件被声明为,并创建了一个新分支。

    因此,您现在有可能执行 git checkout 同时更新到两个不同的版本(每个工作目录一个)。你可以根据需要添加任意多的附件。完成后,只需删除所有无用的附件,然后致电 git worktree prune 让它抛弃一切不再存在的东西(你可以使用 git worktree lock 以防止在附件目录有时不可用时删除其中一些,例如使用可移动设备)。这将允许您同时编译同一应用程序的两个不同版本。

    然而,如果您需要检索软件的特定版本,但在编译之前无法确定是哪个版本,那么您可能需要使用

    git bisect run
    

    相反,它会自动调用一个脚本,告诉你一个修订是好是坏。当编译相当长,并且整个搜索可以跨越几天时,它非常有用。

    这里有一个链接到 documentation page 有关 git工作树 .