2009-12-23 18 views
8

Bazı C++ projeleri içeren varolan bir SVN deposuyla etkileşimde bulunmak için git-svn kullanıyorum. subwcrev.exe, bir C++ üstbilgisinde (svnversion.h) bazı dizeleri güncellemek için önceden oluşturulmuş bir olay olarak kullanılır. Bu dizeler, sonuçta ortaya çıkan ikili için bazı sürüm bilgileri oluşturmak için zorlanır.Git-svn kullanırken öykünme subvcrev

Subwcrev çalışması için .svn meta verileri gerektirdiğinden, pre-build olayı git-svn çalışma kopyasında kullanıldığında başarısız olur. Bu yüzden git repositoryum için post-commit ve post-checkout kasa olarak kullandığım aşağıdaki bash betiği ile geldim. Komut dosyası, git svn bilgisinin (yerel bir dosyada önbelleğe alınmış) çıktısına bağlı olarak subwcrev ile aynı şeyi yapmaya çalışır. Gerçekten şimdiye kadar taklit edilemez Ne

#!/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 

subwcrev denli yararlı olmasını (son teslim SVN revizyon dayalı) yerel bir kararsız değişikliklerin otomatik olarak tespit edilmesi.

$WCREV$, SVN deposunun (altwcrev'nin yaptığı gibi) revizyon numarası ile değiştiriliyor ancak bu sefer derlediğim kodu tanımlamak için kısaltılmış git commit hash'imi ekliyorum. Benim sorum şu: Bir kabuk betiğini, benim mevcut HEAD'ımın son getirilen SVN revizyonundan farklı olup olmadığını ayırt etmenin bir yolu var, bu yüzden -${gitcommit} parçasını eklemeyi ihmal edebilir ve $WCMODS$ değerini false olarak ayarlayabilir miyim?

post-"git svn dcommit" kanca gibi bir şey varsa, benim sorunum da çözülecektir, çünkü o zamandan beri özel kanca svnversion.h farklı şekilde yaratacaktır. Böyle bir kanca bir şekilde eklenebilir mi?

cevap

0

Gerçekten puanlarınızı alamıyorum, ancak önce komut dosyanızı geliştirmeye başladım.

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") 

Daha sonra, for döngüsünde, ayrıntıları açıklayabilir misiniz, hangi sonuca ihtiyacınız var? Bir örnek svnversion_template.h gösterebilir misiniz?

0

Bu nedenle, normalde WCREV'de saklananları almak için git svn info sorgusunun içeriğini kendiniz ayırmanız gerekebilir. örnek sonuçları benim için şuna benzer:

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) 

Şimdi Sorunuzun ikinci kısmı için, senin git BAŞ son svn ödeme eşleşirse komutunu kullanmanız gerekir, söyleyebilir olsun veya olmasın git diff git-svn komut. "git-svn", git-svn programının sürdürdüğü dalın adıdır ve her şey güncelse sonuçlar boş olacaktır.

İlgili konular