使用git-svn时模拟子wwv

时间:2009-12-23 17:06:52

标签: bash git-svn

我使用git-svn与包含一些C ++项目的现有SVN存储库进行交互。 subwcrev.exe用作预构建事件来更新C ++头文件中的某些字符串(svnversion.h)。这些字符串经过硬编译,以形成生成的二进制文件的某些版本信息。

由于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修订版),这使得子wwv非常有用。

我用SVN存储库的修订号替换$WCREV$(就像subwcrev那样)但是这次我添加了我的缩写git commit hash来识别我编译的代码。我现在的问题是:有没有办法在shell脚本中区分我当前的HEAD是否与上次提取的SVN修订版不同,以便我可以省略添加-${gitcommit}部分并将$WCMODS$设置为false?< / p>

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

2 个答案:

答案 0 :(得分: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的样本吗?

答案 1 :(得分: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 checkout匹配,您都需要使用命令git diff git-svn命令。 &#34; GIT-SVN&#34;这是git-svn程序正在维护的分支的名称,如果一切都是最新的,结果将为空。