2009-12-23 1 views
8

git-svn을 사용하여 일부 C++ 프로젝트가 포함 된 기존 SVN 저장소와 상호 작용합니다. subwcrev.exe는 사전 빌드 이벤트로 사용되어 C++ 헤더 (svnversion.h)의 일부 문자열을 업데이트합니다. 이 문자열은 결과 바이너리에 대한 버전 정보를 만들기 위해 하드 컴 파일됩니다.git-svn을 사용할 때 에뮬레이션 subwcrev

subwcrev에서 .svn 메타 데이터가 작동해야하므로 git-svn 작업 복사본에서 사용할 때 사전 빌드 이벤트가 실패합니다. 그래서 나는 git 저장소에 post-commit과 post-checkout hook으로 사용하는 다음 bash 스크립트를 생각해 냈습니다. 이 스크립트는 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 

는 subwcrev 매우 유용합니다 (마지막 체크 아웃 SVN 개정 기준) 현지 않은 변경을 자동으로 감지합니다.

$WCREV$을 SVN 저장소의 개정 번호 (subwcrev가하는 것처럼)로 바꾸 겠지만 이번에는 컴파일 된 코드를 식별하기 위해 내 축약 된 git 커밋 해시를 추가합니다. 내 질문은 지금 : 쉘 스크립트에서 현재 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

따라서 WCREV에 일반적으로 저장된 내용을 얻으려면 git svn info 쿼리의 내용을 직접 파싱해야 할 수도 있습니다. 예제 결과는 나를 위해 다음과 같이 :

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) 

을 이제 질문의 두 번째 부분에 대한 당신의 자식 HEAD 최신 SVN 체크 아웃 일치하는 경우 당신은 명령을 사용해야합니다, 말할 수 있는지 여부를 git diff git-svn 명령. "git-svn"은 git-svn 프로그램이 유지하고있는 브랜치의 이름입니다. 모든 것이 최신 인 경우 결과는 비어 있습니다.