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

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

Dealing with SVN keyword expansion with git-svn

最近,我问到有关Git中关键字扩展的问题,我愿意接受这种设计,而不是真的在Git中支持该想法。

不管是好是坏,我目前正在研究的项目都需要像这样的SVN关键字扩展:

1
svn propset svn:keywords"Id" expl3.dtx

使此字符串保持最新:

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

但是我很想使用Git进行版本控制。 不幸的是,根据文档,git-svn不支持此功能:

"We ignore all SVN properties except svn:executable"

但是用几个前后提交钩子来模拟这个关键字似乎并不难。 我是第一个想要这个的人吗? 有人有一些代码可以做到这一点吗?


这是怎么回事:Git经过优化,可以尽快在分支之间切换。特别地,git checkout被设计为不触摸两个分支中相同的任何文件。

不幸的是,RCS关键字替换打破了这一点。例如,使用$Date$要求git checkout在切换分支时触摸树中的每个文件。对于像Linux内核那样大小的存储库,这将使一切陷入停顿。

通常,最好的选择是标记至少一个版本:

1
$ git tag v0.5.whatever

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

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

在这里,git告诉我我正在使用匿名版本6提交超过v0.5.15.1的版本,并且SHA1哈希以g61cde1d开头。如果将此命令的输出粘贴到某个地方的*.h文件中,则表示您在工作,并且将发行的软件链接回源代码也没有问题。这是首选的处理方式。

如果您无法避免使用RCS关键字,则可能需要从Lars Hjemli的解释开始。基本上,$Id$非常简单,如果您使用的是git archive,也可以使用$Format$

但是,如果您绝对不能避免使用RCS关键字,那么以下内容将帮助您入门:

1
2
3
4
5
6
7
8
9
10
11
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

在我的系统上,我得到:

1
$Date: Tue Sep 16 10:15:02 EDT 2008$

如果在smudgeclean命令中无法使外壳转义起作用时,只需编写您自己的Perl脚本来分别扩展和删除RCS关键字,然后将这些脚本用作过滤器即可。

请注意,您确实不希望对超出绝对必要数量的文件进行更多操作,否则git将失去其大部分速度。


Unfortunately, RCS keyword
substitution breaks this. For example,
using $Date$ would require git
checkout to touch every file in the
tree when switching branches.

那是不对的。 $ Date $等扩展为在签入时保存的值。无论如何,这是有用的。因此,除非实际重新检入文件,否则它在其他修订版或分支上不会更改。
从RCS手册中:

1
2
3
   $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.smudge过滤器的答案是错误的。它插入结帐的时间/日期,或导致结帐运行的任何时间。


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

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

它的设置并不像人们想要的那么简单,但是它似乎可以工作。它使用用perl编写的污迹/干净过滤器对(类似于emk的答案),是的,它将触摸所有扩展名为.gitattributes的文件,通常会降低速度。


您可以在文件上设置ident属性,但这会产生如下字符串

1
$Id: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef$

其中deadbeef...是与该文件相对应的Blob的sha1。如果您确实需要该关键字扩展,并且需要在git repo(而不是导出的存档)中使用它,我认为您将不得不使用ident gitattribute和一个自定义脚本来为该扩展进行扩展您。仅仅使用一个钩子的问题就是工作树中的文件与索引不匹配,而git会认为它已被修改。


推荐阅读

    linux查看扩展名命令?

    linux查看扩展名命令?,工作,系统,地址,信息,软件,文件,标准,电脑,命令,目录,L

    linux命令支持通配符?

    linux命令支持通配符?,工具,系统,命令,灵活,较大,名称,名字,环境,数字,文件,L

    linux命令设置扩展屏?

    linux命令设置扩展屏?,工具,系统,电脑,技术,软件,装备,情况,工作,命令,显示

    linux支持管道的命令?

    linux支持管道的命令?,通信,标准,系统,信息,地方,数据,管道,环境,设备,工具,L

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    linux磁盘扩展命令?

    linux磁盘扩展命令?,在线,信息,扩大,风险,磁盘,虚拟机,容量,分区,目录,链接,L

    复制项目的linux命令?

    复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎

    linux部署项目的命令?

    linux部署项目的命令?,项目,系统,设备,环境,工作,基础,传播,信息,标准,代码,L

    linux项目常用命令?

    linux项目常用命令?,工作,地址,系统,信息,管理,项目,命令,目录,标准,网络,lin

    linux项目更新命令?

    linux项目更新命令?,系统,信息,网络,地址,网站,通信,管理,时间,项目,命令,lin

    启动项目命令linux?

    启动项目命令linux?,工作,经理,产品,技术,地址,数字,系统,项目,命令,信息,怎

    linux中扩展命令缩写?

    linux中扩展命令缩写?,网络,命令,信息,工作,管理,暂停,基础,公司,半导体,时

    linux编译项目的命令?

    linux编译项目的命令?,系统,工作,地址,软件,工具,信息,代码,项目,命令,环境,l

    linux怎么改扩展命令?

    linux怎么改扩展命令?,网络,密码,情况,软件,通用,地址,中心,环境,分区,根目

    项目linux常用命令?

    项目linux常用命令?,工作,地址,系统,管理,设备,信息,项目,命令,目录,标准,lin

    linux高亮关键字命令?

    linux高亮关键字命令?,名称,工作,系统,环境,管理,第一,观察,数据,术语,颜色,l

    linux上部署项目命令?

    linux上部署项目命令?,项目,软件,服务,工具,环境,代理,地址,代码,首页,做好,l

    linux创建项目命令?

    linux创建项目命令?,名称,新增,项目,文件,命令,首次,工作,时间,文件夹,文件

    linux扩展逻辑卷命令?

    linux扩展逻辑卷命令?,管理,系统,环境,信息,工作,位置,时间,网络,平均,基础,L