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

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

我有以下post-checkout文件,它按预期工作:

#!/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忽略我的文件而不管分支?

  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 git rev-list HEAD | sed -n '1p' | cut -c1-10会给你前10个字符作为git-hash。 如果您的本地区域很脏,这是最后一个头的git-hash(我将字符串LAST嵌入到VERSION.hpp中)。 如果这是干净的,它是你真正的当前git-hash。
  2. ruby脚本将检查1.与实际VERSION.hpp文件中的结果。 如果结果已更改,则将新结果写入VERSION.hpp。
  3. 修改我的.bashrc,添加两个小别名–cmakerelcmakedbg​​,用于在我的本地和发布目录中调用cmake,但在我做cmake并在别名中创建之前,我在1.中调用ruby脚本来更新我的VERSION.hpp如果必要。

如果我在git checkout之后调用cmakerel和cmakedbg​​,并且如果我在构建之前没有修改代码(我不应该为实际发布做任何事情),我将需要VERSION.hpp并提供所有正确的信息嵌入式。

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