将多个SVN存储库合并为一个
在考虑了我上一个问题()的答案后,我决定将我拥有的4个左右的存储库合并为一个。当然,这就引出了一个问题,做这件事的最佳方式是什么? 是否有一种方法可以合并两个或多个存储库,以维护这两个存储库的版本历史记录 编辑:我还应该指出,我使用的是Assembla.com,它不提供对svnadmin命令AFAIK的访问 另一个编辑:这有关系吗?如果svnadmin在URL上工作,那么就没有问题。是的,使用and 让我们假设您必须访问存储库,一个具有HEAD修订版100,另一个具有HEAD修订版150 您将转储第一个存储库并将其加载到新存储库中:您将得到第一个存储库的完整故事,从版本0到版本150 然后您转储第二个存储库并将其加载到新的存储库中:它将加载其完整的历史记录,唯一更改的是实际的修订号。第二个存储库的历史记录将在版本151到版本250的新存储库中表示 两个存储库的完整历史记录都是保留的,只有第二次导入的存储库的修订号会更改 当然,这同样适用于两个以上的存储库将多个SVN存储库合并为一个,svn,Svn,在考虑了我上一个问题()的答案后,我决定将我拥有的4个左右的存储库合并为一个。当然,这就引出了一个问题,做这件事的最佳方式是什么? 是否有一种方法可以合并两个或多个存储库,以维护这两个存储库的版本历史记录 编辑:我还应该指出,我使用的是Assembla.com,它不提供对svnadmin命令AFAIK的访问 另一个编辑:这有关系吗?如果svnadmin在URL上工作,那么就没有问题。是的,使用and 让我们假设您必须访问存储库,一个具有HEAD修订版100,另一个具有HEAD修订版150 您将转
编辑:我是在你编辑的时候发布的,所以我没有看到你的笔记…编辑:哦,问题编辑是在我打字的时候进行的。这是一个答案 有没有一种方法可以将两个或多个组合在一起 维护版本的存储库 两者的历史
假设 现有存储库的结构如下:
- 存储库根
- 分支机构
- 标签
- 树干
- 存储库根
- 项目A
- 分支机构
- 标签
- 树干
- 项目B
- 分支机构
- 标签
- 树干
- 项目A
svnadmin dump > project<n>.dmp
svnadmin dump>project.dmp
然后,对于每个转储文件:
svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>
svn mkdir”/project
svnadmin load--父目录“项目”
更复杂的操作是可能的,但这是最简单、最直接的。在转储/加载过程中更改源存储库结构是危险的,但可以通过组合使用svnadmin dump
、svndumpfilter
、手动编辑或附加文本过滤器以及svnadmin load
与第三方提供商打交道
- 为每个存储库请求
文件。提供商应该愿意/能够提供这一点-这是您的代码李>svnadmin dump
- 在本地创建SVN存储库
- 对转储文件执行上面列出的操作
- 验证您最喜爱的客户端的存储库结构是否正确
- 为组合存储库创建转储文件
- 请求提供程序从此转储文件填充新存储库
YMMV:这似乎是一个合理的方法,但我从未与这样的第三方提供商合作过。如果您无法访问svnadmin,这将很难但可行。假设您拥有存储库A和B,并希望将它们合并到存储库C中。以下是完成此操作所需的步骤
这与@Davide Gualano的建议基本相同,不需要svnadmin。您可以编写一个简单的脚本来为您的应用程序执行此操作,当然,如果没有太多的修订,您可以手动执行此操作。使用Subversion 1.7,您现在可以远程执行转储。也就是说,无需访问本地文件系统和
svnadmin dump
命令
您可以使用svnrdump
获取远程存储库的完整转储。有关语法详细信息,请参阅文档
请注意,服务器不必运行1.7,只需运行客户端
这个问题的其他答案使我能够编写下面的脚本。根据您的案例调整回购图。此外,您可能希望将标记和分支移动到“预聚合”目录中,而不是直接移动到新的分支和主干中
#!/bin/bash
NEWREPO=$(pwd)/newrepo
NEWREPOCO="${NEWREPO}_co"
DUMPS=repodumps
REV="0:HEAD"
REPOROOT=/data/svn/2.2.1/repositories/
TOOLDIR=/opt/svn/2.2.1/bin/
PATH=${PATH}:${TOOLDIR}
# Old Repository mapping
declare -A REPOS=(
[BlaEntityBeans]='(
[newname]="EntityBeans"
)'
[OldServletRepoServlet]='(
[newname]="SpreadsheetImportServlet"
)'
[ExperimentalMappingXML]='(
[newname]="SpreadsheetMappingXML"
)'
[NewImportProcess]='(
[newname]="SpreadsheetImportProcess"
)'
)
dump() {
rm -fr ${DUMPS}
mkdir ${DUMPS}
for repo in "${!REPOS[@]}"
do
local dumpfile=${DUMPS}/${repo}.dmp
echo "Dumpimg Repo ${repo} to ${dumpfile}"
svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile}
done
}
loadRepos() {
# new big repo
rm -fr ${NEWREPO}
svnadmin create ${NEWREPO}
svn mkdir file:///${NEWREPO}/trunk -m ""
svn mkdir file:///${NEWREPO}/branches -m ""
svn mkdir file:///${NEWREPO}/tags -m ""
# add the old projects as modules
for currentname in "${!REPOS[@]}"
do
declare -A repo=${REPOS[$currentname]}
local newname=${repo[newname]}
echo "Loading repo ${currentname} soon to be ${newname}"
dumpfile=${DUMPS}/${currentname}.dmp
# import the current repo into a trmporary root position
svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}"
svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile}
# now move stuff arround
# first rename to new repo
svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}"
# now move trunk, branches and tags
for vc in {trunk,branches,tags}
do
echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}"
svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0"
done
svn rm file:///${NEWREPO}/${newname} -m "Removed old ${newname}"
done
}
dump
loadRepos
#/bin/bash
新回购=$(pwd)/新回购
NEWREPOCO=“${NEWREPO}\u co”
转储=重新转储
REV=“0:头”
repoot=/data/svn/2.2.1/repositories/
TOOLDIR=/opt/svn/2.2.1/bin/
路径=${PATH}:${TOOLDIR}
#旧存储库映射
声明-A回购协议=(
[BlaEntityBeans]='(
[newname]=“EntityBeans”
)'
[OldServletRepoServlet]='(
[newname]=“电子表格导入服务”
)'
[ExperimentalMappingXML]='(
[newname]=“电子表格映射XML”
)'
[NewImportProcess]='(
[newname]=“电子表格导入流程”
)'
)
转储(){
rm-fr${DUMPS}
mkdir${DUMPS}
对于“${!REPOS[@]}”中的回购
做
本地转储文件=${DUMPS}/${repo}.dmp
回显“Dumpimg Repo${Repo}到${dumpfile}”
svnadmin dump-r${REV}${repoot}/${repo}>${dumpfile}
完成
}
loadRepos(){
#新的大型回购协议
rm-fr${NEWREPO}
svnadmin创建${NEWREPO}
svn mkdir文件://${NEWREPO}/trunk-m“”
svn mkdir文件://${NEWREPO}/branchs-m“”
svn mkdir文件://${NEWREPO}/tags-m“”
#添加o
projectA
branches
tags
trunk
projectB
branches
tags
trunk
$ svn mkdir -m "Initial project root" \
file:///var/svn/repository_root/Project_A\
file:///var/svn/repository_root/Project_B\
file:///var/svn/repository_root/Project_C\
Revision 1 committed.
$ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump
…
$ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump