源代码管理:同一项目的多个存储库

时间:2009-03-05 20:07:05

标签: svn version-control tortoisesvn repository commit

是否可以为同一个项目拥有多个存储库?

我目前正在使用带有TortoiseSVN的SVN和我家的外部硬盘上的存储库,以及备份方案,这不太理想。

所以我想到的是在unfuddle创建一个帐户并拥有第二个(我的第一个是第一个)存储库,我可以在那里提交(即使是远程备份解决方案)。

当然,我希望代码中的完整性,我不希望两个(或更多?)存储库之间存在差异,这意味着当我提交代码时,两个存储库都应该更新。

那么我该怎么办呢?

我脑子里想的就是提交到我的主存储库(主存储库),然后它会自动提交到在线存储库(未解决的存储库)自动(因为我当然不会我希望每次提交代码时手动提交到两个存储库)

这可能吗?

3 个答案:

答案 0 :(得分:5)

Everything's possible:)

编辑:急速从来没有导致质量,也没有我的答案,错过了问题中的所有Windows引用。所以这里有一个关于如何在Windows上进行同步的故事。

在这种情况下你有两台机器:

  • 机器A:存储库运行的位置 现在
  • 机器B:你想去的地方 同步到。

在B上创建一个您希望从A同步的新存储库。此存储库为空(在rev0上运行)非常重要。

在B上,在新创建的存储库的SVN文件夹中,浏览到/ hooks并创建以下BAT文件:

开始-commit.bat

IF "%2" == "someusername" (goto :label1) else (echo "Only the someusername account may commit new revisions" >&2 )

exit 1
goto :eof

:label1
exit 0

<强>的pre-revprop-change.bat

IF "%3" == "someuser" (goto :label1) else (echo "Only the someuser user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

someuser是机器A存储库中存在的同步器,是唯一拥有机器B存储库权限的用户。非常重要的是没有手动完成提交来加工B的存储库。

在机器A上的存储库的/hooks文件夹中

<强>-commit.bat交

CD PATH_TO_SUBVERSION\bin
svnsync sync svn://machineB/repos --non-interactive --no-auth-cache --source-username machineAusername --source-password machineApassword --sync-username machineBusername --sync-password machineBpassword

一旦这些批处理文件到位,我们需要告诉我们想要同步的B上的存储库:

svnsync initialize svn:// machineB /repos svn:// machineA /repos --non-interactive --no-auth-cache --source-username machineAusername --source-password machineApassword --sync-username machineBusername --sync-password machineBpassword

应返回类似:Copied properties for revision 0.

的内容

现在每次你提交到机器A上的存储库时,它都会被复制到机器B的存储库中。

非常重要的是要注意,如果要同步到Google Code或其他在线存储库,他们将trunk / branches / tags结构提交到版本1.如果您愿意,您必须联系他们以重置存储库将这些第三方存储库位置用作同步存储库。

为了归功于我从http://www.svnforum.org/2017/viewtopic.php?t=5745&sid=06551a22d9c0b5780cf1faab6b0e8ce9

复制了pre-revprop-change.bat和start-commit.bat。

我刚刚在测试库中实现了这一点,并且看起来像一个魅力。我很高兴我发现了这个问题虽然svnsync在我的头骨中沉没得太深了。我打算在工作时设置svn时进行设置。所以我知道明天我将在工作中做的第一件事,谢谢你!

编辑2:

如果你像我一样拥有大量的存储库,这个通用的post-commit.bat可能会吸引你:

SET REPOS=%1
SET REV=%2
SET REPOS=%REPOS:D:\SVN=%

CD "C:\Program Files\Subversion\bin"

svnsync sync svn://machineB/%REPOS%-sync --non-interactive --no-auth-cache --source-username usernameA --source-password passwordA --sync-username usernameB --sync-password passwordB

这会捕获存储库名称并使用它来动态确定同步URL。为了清楚起见,我在机器B上为-sync添加了所有同步存储库。 D:\SVN位是 machineB 上的svnserve根目录,即使此通用BAT文件应放在 machineA 的svnserve root的/ hooks中。

答案 1 :(得分:1)

我不确定我是否完全理解你的问题,但我认为你所寻找的是svnsync

您可以将主存储库放在笔记本电脑的硬盘和桌面/家庭服务器上的镜像存储库中。

只需将更改提交到主存储库,然后将其同步到镜像存储库即可。此过程是增量式的,因此只会更改自上次同步以来的修订,但请注意未版本化的属性。

另外,您可能需要查看herehere

答案 2 :(得分:-1)

从纯SVN角度来看,你只能有一个.svn文件夹,它只能指向你工作文件夹中的1个回购。

你可以在你的svn repo上使用post-commit-hooks来尝试让两个repos保持同步..但是如果你想要的话,你真的只有错误的工具。

您所描述的问题的核心是像GIT这样的分布式版本控制系统。这允许您在本地进行提交,并将其推送到远程存储库。

如果您愿意,您甚至可以在本地使用GIT和SVN作为远程回购。

  • 请参阅GIT了解该工具
  • 请参阅GitHub免费公开托管