【问题标题】:How to embed an updated git-hash into Version.hpp?如何将更新的 git-hash 嵌入到 Version.hpp?
【发布时间】:2012-11-05 21:01:03
【问题描述】:

原标题:如何让 git 忽略我的文件而不管分支?

我有以下按预期工作的结帐后文件:

#!/usr/bin/ruby

cmd = ENV["HOME"] + "/dev/pitbull/cpp/bin/gen_version.rb --write"
`#{cmd}`

gen_version.rb 脚本计算出时间戳、最后一个主标记和 HEAD git 哈希,并写入同样位于 git 中的 VERSION.hpp 文件。

然后我使用use git update-index --assume-unchanged VERSION.hpp 让 git 忽略我的更改。

现在,如果我留在我的开发分支上,这将非常有用。但是当我尝试get checkout master 时,我被搞砸了:

git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    cpp/inc/core/util/VERSION.hpp
Please, commit your changes or stash them before you can switch branches.
Aborting

什么是正确的 git 设置,以便我可以在结帐时更新 VERSION.hpp 但让 git 忽略对此文件的任何更改,而不管我的分支如何?

编辑 我更改了主题,因为最终解决方案实际上解决了一个更广泛的主题,这可能对更多的 SO 用户更有用。因此,您可以通过两种方式阅读该主题:使用原始标题和下面的答案,或者使用上面更广泛的问题,再次使用下面的整个解决方案。

【问题讨论】:

  • 如果我理解正确,您希望在结帐时覆盖对此文件的更改。试试 git checkout -f
  • @Lesstat 听起来很合理,但是当我尝试它时,我得到:错误:条目 'cpp/inc/core/util/VERSION.hpp' 不是最新的。无法合并。
  • 嗯,您是否考虑过将文件与 .gitignore 文件一起忽略?
  • +1 @Lesstat 实际上,我尝试将其从 git 中完全删除,然后将其放入 .gitignore - 我认为这可能有效。有的话以后再更新。泰。
  • 是的,.gitignore 只忽略不在索引中的文件。如果您不想签入文件,您的最后一条评论是正确的做法。

标签: c++ c git githooks


【解决方案1】:

解决我原来的问题:如何让 git 忽略我的文件而不管分支?

  1. git rm cpp/inc/core/util/VERSION.hpp
  2. 将 cpp/inc/core/util/VERSION.hpp 添加到 .gitignore

解决:如何将更新的 git-hash 嵌入到 Version.hpp 中?

部分问题是鸡蛋问题,在签入所有文件之前您无法知道您的哈希值,但在您知道您的 git-hash 之前您无法签入更新的 VERSION.hpp。所以我的解决方案是将 VERSION.hpp 留在存储库之外并放在 .gitignore 文件中。

记住将 VERSION.hpp 嵌入到可执行文件中的目的:如果生产中出现讨厌的错误,使用二进制文件中的 git-hash,我们将知道要检查 git 的代码,以便我们可以正确调试代码。

除了上述两个步骤之外,我还采取了以下步骤:

  1. 编写一个简短的 ruby​​ 脚本,它会根据本地区域是否脏(如果git diff --shortstat 显示多于 0 行,您有脏区域)来做两件事。 git rev-list HEAD | sed -n '1p' | cut -c1-10 会给你前 10 个字符作为 git-hash。如果您的本地区域很脏,这是 LAST HEAD 的 git-hash(我将字符串 LAST 嵌入到 VERSION.hpp 中)。如果这是干净的,那就是你真正的当前 git-hash。
  2. ruby 脚本将检查 1. 中的结果与实际的 VERSION.hpp 文件。如果结果发生变化,则将新结果写入 VERSION.hpp。
  3. 修改我的 .bashrc,添加两个小别名 - cmakerelcmakedbg​​ 用于在我的本地和发布目录中调用 cmake,但在此之前我在别名,我调用 1. 中的 ruby​​ 脚本来更新我的 VERSION.hpp(如有必要)。

如果我在 git checkout 之后调用 cmakerel 和 cmakedbg​​ 并且我在构建之前不修改代码(无论如何我不应该为实际版本做这件事),我将拥有我需要的 VERSION.hpp嵌入适当的信息。

注意 使用别名修改 .bashrc 的另一种解决方案是使用 git 的 post-checkout hook(理论上)。但是,我无法让它工作,而且我已经在这个问题上花费了太多时间,但你可能会有更好的运气。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-05-26
    • 2019-04-08
    • 2012-12-10
    • 2020-03-31
    • 2013-06-12
    • 2018-09-20
    相关资源
    最近更新 更多