3

我正在尝试编写一个脚本,它将许多项目从一个(内部)Subversion 存储库复制到另一个(外部)Subversion 存储库。我尝试过将 svnadmin dump 与 svndumpfilter 结合使用但失败了,并且我不断遇到有关文件已移动且原始位置不再存在的问题。我曾尝试使用 svndumpfilter2 和 svndumpfilter3 但各种错误使我无法继续这条路线。

由于没有必要保留更改的历史记录,我认为一个简单的脚本就足够了。我只是从旧存储库中签出一个项目,使用 switch 更新存储库,然后执行更新。但是,我只是收到一条错误消息,指出新存储库的 UUID 无效:

*svn:'file:///home/developer/svn/NEW_REPO/java/jar/FOO' 的存储库有 uuid 'c315c701-d367-47aa-a473-87f95147eb5f',但 WC 有 '8ce3ae18-f586-4a38 -8bf8-e0fc691799fb'*

这是我的脚本:

svn checkout file:////home/developer/svn/OLD_REPO/java/jar/FOO
cd FOO
svn switch --relocate file:////home/developer/svn/OLD_REPO/java/jar/FOO file:////home/developer/svn/NEW_REPO/java/jar/FOO .
svn update

谁能看到我做错了什么或者 switch 不适合这个任务?

更新

我已经把它向前推进了。UUID 问题与我创建目标存储库的方式有关。从那以后我就跑了

svnadmin setuuid file:////home/developer/svn/NEW_REPO <old_repo_id>

现在我没有得到 UUID 问题。但是我反而得到了这个问题:

svn:无法从内部替换目录

我不明白为什么。尝试从目录外部更新项目也不起作用。

更新

根据建议,我已将脚本切换为现在使用导入和导出,这适用于我的“存储库”为空的时候。我的脚本在随后的时间里不起作用。任何人都可以帮忙。脚本现在是:

# Create a list of projects to Update
echo java/pom/FOO > list.txt;
echo java/jar/FOO2 >> list.txt;
echo java/jar/FOO2 >> list.txt;

for project in `cat list.txt`; do
    echo "Updating: "${project};
    projName=`echo ${project} | awk -F"/" '{print $NF}'`

    # Obtain the current version 
    svn export ${FROM_REPO}${project} ${projName}
    # Remove the .svn information
    find ${projName} -name .svn -exec rm -rf {} \;
    # Import the project into the new repository
    svn import -m 'Updated by script' ${projName} ${TO_REPO}${project}
    rm -rf ${projName}
done;
4

3 回答 3

2

如果使用svn export,则不必删除.svn目录。

我已经做过很多次了。该程序本身相当简单,但确实需要多次通过:

第一关:find $from -type d

  • 如果您在您的目录中找到$from不在 .目录中的目录,$to请执行svn add.
  • 如果 the$from和 the$to都有该目录,则转到下一个。

第二关:find $to

  • 如果您$to的目录或文件中不存在,请$from对该svn delete文件或目录执行操作。

第三关find $from -type d::

  • 如果文件同时存在于$from$to中,则将文件从 复制$from$to
  • 如果文件存在于$from但不存在于 中$to,则将文件复制到该文件$from并对其$to执行svn add操作。

你可以为你的循环做这样的事情:

find `$to` -type -d | while read $directory
do
     blah, blah, blah
done
于 2012-11-23T17:54:56.690 回答
1

如果您只想将项目的 HEAD 修订版(我假设它包含在单个目录中)从一个 svn 存储库移动到另一个,可能最直接的方法是将svn从原始位置导出它(到本地目录),然后svn 将其导入到新位置。

于 2012-11-23T15:09:08.537 回答
0

使用 Mercurial+HGSubversion(以及中间的一些黑魔法),您的流程将是

hg pull OLD_REPO
hg push NEW_REPO
于 2012-11-23T18:41:35.817 回答