这里发生了什么:Git 经过优化,可以尽快在分支之间切换。特别是,git checkout
旨在不触及两个分支中相同的任何文件。
不幸的是,RCS 关键字替换打破了这一点。例如,使用$Date$
将需要git checkout
在切换分支时触摸树中的每个文件。对于 Linux 内核大小的存储库来说,这将使一切戛然而止。
一般来说,最好的办法是标记至少一个版本:
$ git tag v0.5.whatever
...然后从您的 Makefile 中调用以下命令:
$ git describe --tags
v0.5.15.1-6-g61cde1d
在这里,git 告诉我,我正在处理 v0.5.15.1 之后的匿名版本 6 提交,SHA1 哈希以g61cde1d
. 如果您将此命令的输出粘贴到某个*.h
文件中,那么您就是在做生意,并且将已发布的软件链接回源代码不会有任何问题。这是做事的首选方式。
如果您无法避免使用 RCS 关键字,您可能需要从Lars Hjemli 的解释开始。基本上,$Id$
很简单,如果你使用git archive
,你也可以使用$Format$
.
但是,如果您绝对无法避免使用 RCS 关键字,那么以下内容应该可以帮助您入门:
git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'
echo '$Date$' > test.html
echo 'test.html filter=rcs-keyword' >> .gitattributes
git add test.html .gitattributes
git commit -m "Experimental RCS keyword support for git"
rm test.html
git checkout test.html
cat test.html
在我的系统上,我得到:
$Date: Tue Sep 16 10:15:02 EDT 2008$
smudge
如果您无法在and命令中使用 shell 转义符clean
,只需编写您自己的 Perl 脚本来分别扩展和删除 RCS 关键字,并将这些脚本用作您的过滤器。
请注意,您真的不想对超过绝对必要的文件执行此操作,否则 git 将失去大部分速度。