2012-04-11 12 views
0

Ich arbeite an einem SVN-Repository außerhalb meiner Kontrolle. Es verwendet ein Standardlayout mit sehr strengen Berechtigungen.git-svn mit strikter Erlaubnis

Ich habe keine Berechtigung für den übergeordneten Ordner gelesen.

svn://foo.bar/project/ 
svn://foo.bar/project/branches 

Aber ich kann svn://foo.bar/project/trunk und svn://foo.bar/project/branches/x lesen.

Wenn ich mehrere Fernbedienungen mit git-svn verwende, kann ich diese Zweige holen und committen. Aber der git-svn findet die Eltern nicht. Mehrere Fernbedienungen werden als unterschiedliche Repositories behandelt.

Es scheint, ich kann die git-svn ändern, um die folgende übergeordnete Quelle zu korrigieren. Aber ich kenne Perl nicht. Ist es möglich, ein Skript zu schreiben, das den übergeordneten Hash der Zweigstelle repariert? Oder kann ich ein einfaches Skript verwenden, um eine neue entfernte Verzweigung zu erstellen, dann lasse git-svn sie holen.

Antwort

0

Ich schrieb ein einfaches schmutziges Shell-Skript, um den neuen Zweig zu initialisieren. Es wird das erste Commit für den SVN-Zweig erstellen. Danach wird die git-svn fetch --all funktionieren.

#!/bin/bash 

branch=$1 
prefix=svn-remote.svn-$branch 
rooturl=svn://example.com 
branchurl=$rooturl/foo/branches 
git config $prefix.ignore-paths "^exclude" 
git config $prefix.url $branchurl/$branch 
git config $prefix.fetch :refs/remotes/$branch 

logentry=$(svn log -v -r0:HEAD --stop-on-copy -l 1 --xml $branchurl/$branch) 
torev=$(echo "$logentry" |grep revision |grep -o [0-9]*) 
fromrev=$(echo "$logentry" |grep copyfrom-rev |grep -o [0-9]*) 
frompath=$(echo "$logentry" |grep copyfrom-path | sed -E 's/\s*copyfrom-path="(.*)"/\1/') 
author=$(echo "$logentry" |grep "<author>" |sed -E 's#</?author>##g') 
author_date=$(echo "$logentry" |grep "<date>" |sed -E 's#</?date>##g') 

if [ -z $torev ];then 
    exit 1; 
fi 

if [ -z $fromrev ];then 
    exit 2; 
fi 

if [ -z $frompath ];then 
    exit 3; 
fi 

[email protected]$fromrev 
tourl=$branchurl/[email protected]$torev 
frombranch=$(basename $frompath) 
echo $fromurl 
echo $tourl 
echo $fromrev 
parent=$(git svn log -r $fromrev $frombranch --oneline --show-commit |grep $fromrev |awk '{print $3}') 
if [ -z $parent ];then 
    exit 4; 
fi 
uuid=$(git log -1 |grep git-svn-id: | awk '{print $NF}') 
tree=$(git cat-file commit $parent |head -1 |cut -d ' ' -f 2) 
echo tree $tree 
echo parent $parent 
echo uuid $uuid 

head=$(GIT_AUTHOR_NAME=$author [email protected]$uuid GIT_AUTHOR_DATE=$author_date git commit-tree $tree -p $parent <<EOF 
$logentry 

git-svn-id: $tourl $uuid 
EOF 
) 
echo $head 
git update-ref refs/remotes/$branch $head 
+0

Wie keine anderen Antworten. Ich akzeptiere die Antwort von mir. – Yaocl