我使用 git-svn 与包含一些 C++ 项目的现有 SVN 存储库进行交互。 subwcrev.exe 用作预构建事件来更新 C++ 标头 (svnversion.h) 中的某些字符串。这些字符串被硬编译以形成生成的二进制文件的一些版本信息。
由于 subwcrev 需要 .svn 元数据才能工作,因此在 git-svn 工作副本上使用预构建事件将会失败。因此,我想出了以下 bash 脚本,将其用作 git 存储库的提交后和签出后挂钩。该脚本尝试根据 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 非常有用。
我正在更换$WCREV$
带有 SVN 存储库的修订号(如 subwcrev 所做的那样),但这次我添加了缩写的 git commit 哈希来标识我编译的代码。我现在的问题是:有没有办法在 shell 脚本中区分我当前的 HEAD 是否与上次获取的 SVN 修订版本不同,以便我可以省略添加-${gitcommit}
部分和集合$WCMODS$
为假?
如果有一些东西像post-"git svn dcommit"
钩子,我的问题也将得到解决,因为那时那个特殊的钩子将以不同的方式创建 svnversion.h 。可以以某种方式添加这样的钩子吗?
我不太明白你的观点,但首先开始改进你的脚本。
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 的一个示例吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)