2

我有一个非常大的存储库,我们将开始将存储库中的每个项目分解为单独的存储库。但是,我遇到了一些关于 Node-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'

我已经做了一些努力来重写转储文件和修订定义,但它似乎没有正确匹配,因此很难自动化这个过程。欢迎任何更改建议,但请注意,由于 repo 的大小,使用 svndumpfilter 并不是一个真正的选择,它需要几个小时才能打破一个项目,而这个 repo 包含数千个。

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

请注意,修订号的重写在一定程度上减轻了 node-copyfrom-rev 的影响,但并非完全缓解,因为在以这种方式转储时,有时 node-copyfrom-repo 点似乎不正确。

4

0 回答 0