原标题:无论分支如何,如何让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用户更有用。因此,您可以通过两种方式阅读本主题:使用原始标题和下面的答案,或者使用上面更广泛的问题,再次使用下面的整个解决方案。
答案 0 :(得分:3)
解决我原来的问题:无论分支如何,如何让git忽略我的文件?
要解决:如何将更新的git-hash嵌入到Version.hpp中?
问题的一部分是鸡蛋问题,在签入所有文件之前你无法知道你的哈希,但是在你知道你的git-hash之前你不能检查更新的VERSION.hpp。所以我的解决方案是将VERSION.hpp从存储库和.gitignore文件中删除。
请记住,将VERSION.hpp嵌入到可执行文件中的目的是:如果生产中出现了令人讨厌的错误,并且二进制文件中包含git-hash,我们将知道要检出git的代码,以便我们可以正确调试代码。
除了上述两个步骤之外,我还采取了以下步骤:
git diff --shortstat
显示的行数超过0行,你有一个脏区域)做两件事。 git rev-list HEAD | sed -n '1p' | cut -c1-10
将为您提供前10个字符作为git-hash。如果您的本地区域很脏,这是最后一个头的git-hash(我将字符串LAST嵌入到VERSION.hpp中)。如果这是干净的,那就是你当前的真正的git-hash。如果我在git checkout之后调用cmakerel和cmakedbg,并且如果我在构建之前没有修改代码(我不应该为实际版本执行此操作),那么我将需要所有需要的VERSION.hpp嵌入适当的信息。
注意使用别名修改.bashrc的另一种解决方案是使用git的 post-checkout hook (理论上)。但是,我无法解决这个问题,而且我已经在这个问题上花了太多时间,但你可能会有更好的运气。