Svn 从回购中剥离项目

Svn 从回购中剥离项目,svn,split,Svn,Split,我有一个存储库,它的规模已经发展到了难以置信的地步,我们将开始将回购协议中的每个项目分解成单独的回购协议。但是,我遇到了两个与节点copyfrom rev有关的问题,这两个问题在转储/加载时没有正确匹配,导致以下情况: svnadmin: E160006: Relative source revision -18169 is not available in current repository svnadmin: E160013: File not found: transaction '37

我有一个存储库,它的规模已经发展到了难以置信的地步,我们将开始将回购协议中的每个项目分解成单独的回购协议。但是,我遇到了两个与节点copyfrom rev有关的问题,这两个问题在转储/加载时没有正确匹配,导致以下情况:

svnadmin: E160006: Relative source revision -18169 is not available in current repository
svnadmin: E160013: File not found: transaction '37-1c', path 'tags/1.6.1/file.php'
我已经做了一些努力来重写转储文件和修订定义,但它似乎没有正确匹配,这使得这个过程很难自动化。欢迎您提出任何更改建议,但请注意,由于回购协议的规模,使用svndumpfilter并不是一个真正的选项。仅完成一个项目需要数小时,而该回购协议包含数千个项目

#!/bin/bash

project=$1
repo=/root/svn-copy/oldrepo
rm -fr $project*
mkdir $project
cd $project
svnadmin create $project
i=1
svn log file://$repo $project | grep -e ".*r[0-9].*|.*" | awk '{ print substr($1,2) }' | sort -g | while read rev; do
    revs[$rev]=$i
    svnadmin dump $repo --quiet -r $rev --incremental >> $project.$rev.bak

# Rewrite revision number to ease rewrite of Node-copyfrom
perl -pi -e "s/Revision-number: $rev/Revision-number: $i/;" $project.$rev.bak
# Rewrite node-paths
perl -pi -e "s/Node-path: $project\//Node-path: /;" $project.$rev.bak
# Rewrite Node-copyfrom-path
perl -pi -e "s/Node-copyfrom-path: $project\//Node-copyfrom-path: /;" $project.$rev.bak

# Rewrite Node-copyfrom-rev
for rev in $(grep Node-copyfrom-rev $project.$i.bak | awk '{ print $2 }'); do
    perl -pi -e "s/Node-copyfrom-rev: $rev/Node-copyfrom-rev: ${revs[$rev]}/;" $project.$i.bak
done

# Remove prop for old project-folder
sed -i "/Node-path: $project/,/PROPS-END/d" $project.$rev.bak

svnadmin load --ignore-uuid $project < $project.$rev.bak
    let i=$i+1
    rm -fr $project.$rev.bak
done

svnadmin setuuid $project
#/bin/bash
项目=1美元
repo=/root/svn copy/oldrepo
rm-fr$项目*
mkdir$项目
cd$项目
svnadmin创建$project
i=1
svn日志文件://$repo$project | grep-e“*r[0-9].|.*”| awk'{print substr($1,2)}'| sort-g | while read rev;做
转速[$rev]=$i
svnadmin dump$repo--quiet-r$rev--incremental>>$project.$rev.bak
#重写修订号以简化节点copyfrom的重写
perl-pi-e“s/Revision number:$rev/Revision number:$i/;”“$project.$rev.bak
#重写节点路径
perl-pi-e“s/Node path:$project\//节点路径:/;”$project.$rev.bak
#从路径重写节点副本
perl-pi-e“s/Node copyfrom path:$project\//Node copyfrom path://;”“$project.$rev.bak
#从版本重写节点副本
对于$版本(grep节点copyfrom rev$project.$i.bak | awk'{print$2}');做
perl-pi-e“s/Node copyfrom rev:$rev/Node copyfrom rev:${revs[$rev]}/;”$project.$i.bak
完成
#删除旧项目文件夹的道具
sed-i“/节点路径:$project/,/PROPS-END/d“$project.$rev.bak
svnadmin load——忽略uuid$project<$project.$rev.bak
设i=$i+1
rm-fr$项目$rev.bak
完成
svnadmin setuuid$项目
请注意,对修订号的重写在一定程度上减轻了节点copyfrom rev的影响,但并非完全如此,因为这样转储时,节点copyfrom repo点似乎不正确