2012-04-11 91 views
0

我正在使用一個不受我控制的svn存儲庫。它使用具有非常嚴格權限的標準佈局。具有嚴格權限的git-svn

我沒有讀取父文件夾的權限。

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

但我可以讀svn://foo.bar/project/trunksvn://foo.bar/project/branches/x

如果我用git-svn使用多個遙控器,我可以獲取並提交這些分支。但是git-svn不會找到分支的父項。多個遙控器將被視爲不同的存儲庫。

看來我可以修改git-svn來糾正後面的父源。但我不知道Perl。 是否有可能編寫腳本修復分支的父散列。或者我可以使用一個簡單的腳本創建新的遠程分支,然後讓git-svn來獲取它。

回答

0

我寫了一個簡單的髒外殼腳本來初始化新分支。它將爲svn分支創建第一個提交。之後git-svn fetch --all將工作。

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

由於沒有其他答案,我接受自己的答案。 – Yaocl 2012-04-20 01:53:55