我使用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。可以以某種方式添加這樣的鉤子嗎?