2009-12-23 138 views
8

我使用git-svn与包含一些C++项目的现有SVN repository进行交互。 subwcrev.exe被用作预生成事件来更新C++头文件(svnversion.h)中的一些字符串。这些字符串会被硬编译以形成生成的二进制文件的某些版本信息。在使用git-svn时仿真subwcrev

由于subwcrev需要.svn元数据才能工作,因此在git-svn工作副本上使用时,预生成事件将失败。所以我想出了以下bash脚本,我将它用作我的git存储库的post-commit和post-checkout钩子。该脚本尝试根据git svn info(缓存在本地文件中)的输出与subwcrev做同样的事情。

#!/bin/sh 
if [ ! -f svninfo ] ; then 
    git svn info > svninfo 
fi 

revision=`sed -e "/Revision/!d" -e "s/Revision: \(.*\)/\1/" svninfo` 
lastchange=`sed -e "/Last Changed Rev/!d" -e "s/Last Changed Rev: \(.*\)/\1/" svninfo` 
# Get the last changed date, extract timestamp, replaces dashes with slashes 
changedate=`sed -e "/Last Changed Date/!d" -e "s/Last Changed Date: \(.\{19\}\).*/\1/" -e "s!-!\\\\\\/!g" svninfo` 
now=`date "+%Y\/%m\/%d %H:%M:%S"` 

gitcommit=`git show --abbrev-commit | sed -n -e "s/commit //p"` 

for entry in $(find -name svnversion_template.h); do 
    newname=`echo $entry|sed -e "s/_template//"` 
    sed -e "s/\\\$WCRANGE\\\$/${revision}/" \ 
     -e "s/\\\$WCREV\\\$/${lastchange}-${gitcommit}/" \ 
     -e "s/\\\$WCDATE\\\$/${changedate}/" \ 
     -e "s/\\\$WCNOW\\\$/${now}/" \ 
     -e "s/\\\$WCURL\\\$/local git repo/" \ 
     -e "s/\\\$WCMODS.*\\\$/(true)/" \ 
     -e "s/\\\$WCMIXED.*\\\$/(false)/" \ 
     $entry > `echo $entry|sed -e "s/_template//"` 
done 

我真的不能效仿至今的本地提交的修改(基于最后检出的SVN版本)的自动检测,使subwcrev非常有用。

我用SVN仓库的修订版本代替$WCREV$(这是subwcrev会做的),但是这次我添加了我的缩写git commit hash来标识我编译的代码。我现在的问题是:是否有一种方法可以在shell脚本中区分我的当前HEAD与上次获取的SVN修订版是否不同,以便我可以省略添加-${gitcommit}部分并将$WCMODS$设置为false?

如果有一些事情像post-"git svn dcommit"挂钩,我的问题也会得到解决,因为那个特殊挂钩会以不同的方式创建svnversion.h。可以以某种方式添加这样的钩子吗?

回答

0

我并没有真正明白你的观点,但是先开始改进脚本。

revision=$(grep -Po "(?<=Revision:).*" svninfo) 
lastchange=$(grep -Po "(?<=Last Changed Rev:).*" svninfo) 
# Get the last changed date, extract timestamp, replaces dashes with slashes 
changedate=$(grep -Po "(?<=Last Changed Date:).{19}" svninfo) 
changedate=${changedate//-//} 
now=$(date "+%Y\/%m\/%d %H:%M:%S") 

然后,在for循环中,您能否请详细解释,您需要什么结果? 你可以显示一个svnversion_template.h的例子吗?

0

因此,您可能必须自己解析git svn info查询的内容才能获取通常存储在WCREV中的内容。这个例子的结果是这样对我来说:

git svn info 
Path: . 
URL: http://myurl.com/trunk/myrepo 
Repository Root: http://myurl.com 
Repository UUID: 15fed3e9-81ce-ef4a-a7da-fc36e3df1edc 
Revision: 14106 
Node Kind: directory 
Schedule: normal 
Last Changed Author: myusername 
Last Changed Rev: 14106 
Last Changed Date: 2015-05-29 10:23:10 -0400 (Fri, 29 May 2015) 

现在你问题的第二部分,你能否告诉我们,如果你的git HEAD最新的svn签匹配,你需要使用命令git diff git-svn命令。 “git-svn”这里是git-svn程序维护的分支的名称,如果一切都是最新的,结果将是空的。