首页 > 解决方案 > 是否可以将我当前提交的 SHA 添加到核心文件模式?

问题描述

我希望将 git sha 添加到核心文件模式中,这样我就可以确切地知道哪个提交用于生成核心文件。有没有办法做到这一点?

标签: linuxgitcoredump

解决方案


我不清楚“核心文件模式”是什么意思。(特别是,当一个进程崩溃并且 Linux 内核生成一个核心转储时,它使用kernel.core_pattern. 这个设置是系统范围的,而不是每个进程的。有一种方法可以运行一个辅助程序 - 请参阅如何更改核心模式仅适用于一个特定的应用程序? -但这只能让你到目前为止;你仍然需要编写那个程序。另见https://wiki.ubuntu.com/Apport。)但是这里有一个普遍的问题,它有一些 hacky 解决方案,所有这些都是一个非常明显的方法的变体,它仍然有点聪明。

一般问题

您将要进行的提交的哈希在您提交之前是未知的。更糟糕的是,即使您可以计算您将要进行的提交的哈希值(您可以,但这很困难),如果您随后更改将进入提交的某些已提交文件的内容,以便包含此哈希值,您更改了您所做的提交的内容,这意味着您获得了不同的实际提交哈希。

简而言之,不可能在 commit 内部提交 commit 的 commit hash。

骇人听闻的解决方案

一般的想法是编写一个在构建过程中使用的未跟踪文件,以便二进制文件在某个容易找到的地方包含提交哈希。对于使用 Make 构建的项目,请参阅如何将 git commit-number 包含到 c++ 可执行文件中?对于一些方法。

构建 tarball 时可以使用相同的方法。Git 能够使用ident过滤器将文件(blob 对象)的哈希 ID 嵌入到工作树文件中,但这是文件的 ID ,通常没有用处。因此,相反,如果您用于生成 tar 或 zip 文件,则可以使用gitattributes 文档所述和文档中提到的. 请注意,tar 或 zip 存档还直接保存提交哈希 ID。git archiveexport-substgit archive

最后,您可以编写自己的自定义涂抹过滤器,将提交哈希 ID 嵌入到工作树文件中。这在没有等效的外部make进程运行来生成二进制文件的语言中可能很有用。这里的问题是,当涂抹过滤器读取时HEAD,它被设置为完成之前的值git checkout,而不是完成之后的值。这使得提取正确的提交哈希 ID 变得非常困难(如果甚至有一个正确的哈希 ID——注意,如果有指示,git describe将附加以指示工作树与提交-dirty不匹配,在适当的时候)。HEAD


推荐阅读