SVN属性中的标识工具备选方案

SVN属性中的标识工具备选方案,svn,cvs,rcs,ident,version-control-keywords,Svn,Cvs,Rcs,Ident,Version Control Keywords,我们已经在CVS中通过RCS关键字使用了“Ident”工具,从源代码中获取了一些信息,如“ID”和“DATE”。我们只需在文本文件中插入关键字$Id$和$Date$就可以做到这一点,好的方面是当我们编译程序时,可以通过Ident工具从二进制文件中获得相同的信息: $ ident a.out 现在,我们正在使用SVN。它仍然可以简单地通过具有更好特性的svn属性来完成。唯一的问题是,我们只在文本文件中获取这些信息,但我们还需要以某种方式从二进制编译文件中获取它们,如上面的Ident 知道如何从二

我们已经在CVS中通过RCS关键字使用了“Ident”工具,从源代码中获取了一些信息,如“ID”和“DATE”。我们只需在文本文件中插入关键字$Id$和$Date$就可以做到这一点,好的方面是当我们编译程序时,可以通过Ident工具从二进制文件中获得相同的信息:

$ ident a.out
现在,我们正在使用SVN。它仍然可以简单地通过具有更好特性的svn属性来完成。唯一的问题是,我们只在文本文件中获取这些信息,但我们还需要以某种方式从二进制编译文件中获取它们,如上面的Ident


知道如何从二进制文件中获取它们吗?

当设置关键字时,Subversion将创建一个相同的ID类型字符串。在二进制程序中未设置关键字,因为这会损害二进制程序。而是在源代码中创建一个包含如下版本信息的字符串变量:

VERSION_STRING = "$Id$";
当Subversion执行签出时,它会将其扩展到:

VERSION_STRING = "$Id: foo.blah 12338 2014/06/12 02:11:38 bsmith $";
由于这是一个变量,它将保存在二进制代码中,并且
ident
程序应该能够找到它

确保在此源文件上设置了Subversion属性。否则,Subversion将不会扩展关键字

而不是为什么你不应该使用关键字扩展


关键字扩展是一个从更原始的版本控制系统开始的概念。这是一种跟踪修订的方法,因为
工作目录的概念不存在。最后,关键词不仅仅是一种痛苦,更是一种不值的痛苦。有趣的是,第一个放弃自动关键字的版本控制系统是基于RCS的CVS。CVS是第一个版本控制系统,它创建了一个工作目录,而不是一个接一个地对单个文件进行版本控制

一个程序不是一个或两个文件,它可以是几十个,甚至几百个。如果我在一个文件中放置了我的
$Id$
关键字,则显示的版本信息就是该文件的版本信息。如果我不修改该文件,那么每个版本中的版本信息都是相同的。一种解决方法是在每个文件中添加关键字:

$ ident /bin/ksh | wc -l 
    58
我的
/bin/ksh
文件中有57个单独的关键字。现在,我所要做的就是查看每个单独的ID,并推断出我实际拥有的Kornshell的版本

或者我可以这样做:

$ ksh --version
  version         sh (AT&T Research) 93u 2011-02-08
啊,现在我知道我要签出的代码的版本了。它可能是用
93u 2011-02-08
标记的(因为CVS和RCS不允许使用空格或以数字开头的标记。但是,我应该能够轻松地将其转换为特定的CVS/RCS标记)。使用CVS,我可以查看日志信息,并查看发生了哪些更改。某个bug被修复了吗?是否添加了特定功能?谁改变了密码

为了创建此信息,生成系统使用某种方法在签出源文件时使用此信息修改源文件。你甚至不需要做出改变。事实上,最好不要这样做。我的消息来源如下:

VERSION = "$Id: %VERSION% $";
<copy file="${version.file}"
    tofile="${actual.version.file}">
    <filterset>
         <filter token="VERSION" value="${env.JENKINS_JOB} Build #${env.BUILD_NUMBER}"/>
    </filterset>
</copy>
$Id: Project-trunk Build #343 $
通过构建,系统将
%VERSION%
替换为我想要的
%VERSION%
。甚至像PHP或JavaScript这样的非编译代码也可以从中受益。将其与这样的CI系统相结合,可以运行单元测试,并将软件与代码中的每个更改打包,这样您就可以在实际版本中自动包含这些更改

我们是一家Java商店,因此我们将以下信息嵌入其中:

VERSION = "$Id: %VERSION% $";
<copy file="${version.file}"
    tofile="${actual.version.file}">
    <filterset>
         <filter token="VERSION" value="${env.JENKINS_JOB} Build #${env.BUILD_NUMBER}"/>
    </filterset>
</copy>
$Id: Project-trunk Build #343 $
ident
命令可以将其识别出来。此构建与一组特定的Subversion修订版(甚至可能是Subversion标记)相关,通过使用Subversion,我可以看到所做的更改,以及是否将其集成到问题跟踪系统中。事实上,为什么你要这么做,为什么不设置它,让SCCS的“what”命令也可以拾取它:

$Id: @(#) Project-trunk Build #343 < $

你的意思是Subversion忽略二进制文件中的
svn:keywords
?他没有对此发出警告。事实上,它包含了一个关于二进制文件中关键字替换的注释:-?因此,如果您想从二进制文件中获取“ID”,您如何才能做到这一点?你当然不会通过文本编辑器打开它来查看你的关键词替换!“有趣的是,第一个放弃自动关键字的版本控制系统是基于RCS的CVS。”——CVS没有放弃自动关键字替换。至少在默认情况下,它的工作方式与RCS基本相同。您可能是对的。当我使用CVS时,我总是看到
CVSROOT/configure
设置为具有
KeywordExpand=I
,除非您通过
-kkv
另外声明,否则该设置将阻止关键字展开。我认为这是默认情况。这可能就是我使用过的所有站点的
CVSROOT
配置方式。