2009-12-23 144 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程序維護的分支的名稱,如果一切都是最新的,結果將是空的。