用git-svn处理SVN关键字扩展

我最近问了关于Git中的关键字扩展问题 ,我愿意接受这个devise,而不是真的在Git中支持这个想法。

无论好坏,我目前正在进行的项目都需要像这样的SVN关键字扩展:

svn propset svn:keywords "Id" expl3.dtx 

保持这个string是最新的:

 $Id: expl3.dtx 803 2008-09-11 14:01:58Z will $ 

但我很想用Git来做我的版本控制。 不幸的是,根据文档,git-svn不支持这个:

“我们忽略了除svn:executable之外的所有SVN属性”

但是,通过一些前/后提交钩子模拟这个关键字的东西似乎并不是太棘手。 我是第一个想要这个的人吗? 有没有人有一些代码来做到这一点?

这里发生了什么事情:Git被优化为尽可能快地在分支之间切换。 特别是, git checkout被devise为不接触任何两个分支都相同的文件。

不幸的是,RCS关键字replace破坏了这个。 例如,使用$Date$需要使用git checkout在切换分支时触摸树中的每个文件。 对于一个Linux内核的大小的仓库来说,这会让所有的事情都停下来。

一般来说,你最好的select是标记至less一个版本:

 $ git tag v0.5.whatever 

…然后从您的Makefile中调用以下命令:

 $ git describe --tags v0.5.15.1-6-g61cde1d 

在这里,git告诉我,我正在使用一个匿名版本6提交v0.5.15.1,其中一个以g61cde1d开头的SHA1哈希。 如果你把这个命令的输出粘贴到某个地方的*.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$ 

如果在smudgeclean命令smudge shell转义无法正常工作,那么只需编写自己的Perl脚本来分别扩展和删除RCS关键字,并将这些脚本用作filter。

请注意,你真的不希望为了更多的文件做这个比绝对必要的,否则git将失去它的大部分速度。

不幸的是,RCS关键字replace打破了这个。 例如,使用$ Date $需要使用git checkout在切换分支时触摸树中的每个文件。

那是不正确的。 $ Date $等扩展到在checkin时间保存的值。 无论如何,这是非常有用的。 所以它不会在其他版本或分支上更改,除非该文件实际上被重新签入。 从RCS手册:

  $Date$ The date and time the revision was checked in. With -zzone a numeric time zone offset is appended; otherwise, the date is UTC. 

这也意味着使用rcs-keyword.smudgefilter的build议答案不正确。 它会插入结帐的时间/date,或者是导致它运行的任何东西。

下面是一个示例项目,其中包含将RCS关键字支持添加到git项目所需的configuration和过滤代码:

https://github.com/turon/git-rcs-keywords

这不是一个简单的设置,但它似乎工作。 它使用一个用perl编写的污点/干净的filter对(类似于emk的回答所描述的),是的,它会触及具有在.gitattributes中设置的扩展名的所有文件,通常会放慢一点。

你可以在你的文件上设置ident属性,但是会产生类似的string

 $Id: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef$ 

deadbeef...是对应于该文件的blob的sha1。 如果你真的需要这个关键字扩展,并且你需要它在git仓库中(而不是导出的仓库),我想你将不得不用一个自定义的脚本去为你的扩展。 刚刚使用钩子的问题是工作树中的文件不匹配索引,git会认为它已被修改。