6

同一个项目可以有多个存储库吗?

我目前正在将 SVN 与 TortoiseSVN 一起使用,并将存储库放在我家的外部硬盘上,并且关于备份解决方案,这并不理想。

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

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

那么我能做些什么来实现这一点呢?

我的想法是提交到我的主存储库(主存储库),然后它会自动自动提交到在线存储库(unfuddle 存储库)(因为我当然不想每次都手动提交到两个存储库)提交我的代码)

这可能吗 ?

4

3 回答 3

5

一切皆有可能:)

编辑:匆忙永远不会导致质量,我的回答也没有,错过了问题中的所有 Windows 引用。所以这里有一个关于如何让同步在 Windows 上工作的问题。

在这种情况下,您有 2 台机器:

  • 机器 A:存储库现在运行的位置。
  • 机器 B:您要同步到的位置。

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

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

开始提交.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 的存储库。

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

提交后.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://机器B/repos svn://机器/repos --non-interactive --no-auth-cache --source-username A机器用户名机器 密码机用户名--source-password 机器 --sync-username B密码 --sync-password

它应该返回如下内容:Copied properties for revision 0.

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

请务必注意,如果您想同步到Google 代码或其他在线存储库,他们将主干/分支/标签结构提交到修订版 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 根的 /hooks 中。

于 2009-03-05T20:12:03.343 回答
1

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

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

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

你也可能想看看这里这里

于 2009-03-05T21:02:41.053 回答
-1

从纯 SVN 的角度来看,您只能拥有一个 .svn 文件夹,该文件夹指向您的工作文件夹中的 1 个 repo。

您可以在您的 svn repo 上使用 post-commit-hooks 来尝试使两个 repos 保持同步.. 但实际上,如果这是您想要的,那么您只是使用了错误的工具。

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

如果你愿意的话,你甚至可以在本地使用 GIT 和 SVN 作为你的远程仓库。

  • 请参阅GIT获取该工具
  • 参见GitHub免费公共托管
于 2009-03-05T21:04:45.727 回答