您需要使用 2-URL 合并,正如 svn help merge 中的文本所述:
-
这种形式称为“2-URL 合并”:
svn merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]
仅当其他变体不使用时,才应使用此合并变体
适用于您的情况,因为此变体可能非常复杂
主人。
指定了两个源 URL,标识同一棵树上的两棵树
分支或不同的分支。比较树木和
从 SOURCE1@REV1 到 SOURCE2@REV2 的差异应用于
TARGET_WCPATH 中目标分支的工作副本。目标
分支可能与一个或两个来源相同,或再次不同。
所涉及的三个分支可以完全不相关。
[...]
2-URL 合并示例:
已在名为“foo”的单独分支上开发了两个功能,
'酒吧'。此后很明显,“bar”应该与
'foo' 分支,以便在重新集成之前进一步开发。
虽然两个特性分支都来自主干,但它们不是
直接相关——一个不是另一个的直接副本。一个 2-URL
合并是必要的。
您说每个分支都已将 trunk 中的所有更改合并到其中,因此不需要为第一个源指定修订。
首先对您的 A 分支进行干净的结帐。然后,将 B 合并到 A:
svn merge ^/trunk ^/branches/B
这会将 B 和 trunk 之间的差异合并到您的工作副本中,即 A。验证并提交这些更改(您可以通过在上述命令中将 diff 替换为 merge 来预览合并):
svn commit -m "Merging B to A"
接下来,将C合并到A:
svn merge ^/trunk ^/branches/C
这会将 C 和 trunk 之间的差异合并到您的工作副本中,即 A 与 B的变化。验证并提交这些更改,现在您的 A 分支将拥有所有 B 和 C 的更改。
为了验证这一点,我创建了一个简单的脚本(Windows 批处理文件)。首先设置一些路径常量:
@ECHO OFF
SET CWD=%~dp0
SET REPO_NAME=repo
SET REPO_PATH="%CWD%%REPO_NAME%"
SET WC_NAME=wc
SET WC_PATH="%CWD%%WC_NAME%"
:: Create REPO URI (C:\path\to\repo -> file:///C:/path/to/repo, see http://stackoverflow.com/a/27817626/1698557)
FOR /f "delims=" %%R IN (%REPO_PATH%) DO SET REPO_URL=%%~fR%
SET REPO_URL=file:///%REPO_URL%
SET REPO_URL=%REPO_URL:///\\=//%
SET REPO_URL=%REPO_URL:\=/%
SET REPO_URL="%REPO_URL%"
:: Cleanup previous run
RMDIR /S /Q %REPO_PATH%
RMDIR /S /Q %WC_PATH%
然后创建一个存储库和结帐主干:
svnadmin create %REPO_PATH%
svn mkdir %REPO_URL%/trunk -m "Creating trunk directory"
svn mkdir %REPO_URL%/branches -m "Creating branches directory"
:: Checkout trunk
svn checkout %REPO_URL%/trunk %WC_PATH%
在创建虚拟内容和分支之间交替,以便分支具有不同的内容:
echo alpha > %WC_PATH%\alpha.txt
svn add %WC_PATH%\alpha.txt
svn commit %WC_PATH% -m "Creating alpha.txt in trunk"
svn copy %REPO_URL%/trunk %REPO_URL%/branches/A -m "Creating branch A"
echo beta > %WC_PATH%\beta.txt
svn add %WC_PATH%\beta.txt
svn commit %WC_PATH% -m "Creating beta.txt in trunk"
svn copy %REPO_URL%/trunk %REPO_URL%/branches/B -m "Creating branch B"
echo gamma > %WC_PATH%\gamma.txt
svn add %WC_PATH%\gamma.txt
svn commit %WC_PATH% -m "Creating gamma.txt in trunk"
svn copy %REPO_URL%/trunk %REPO_URL%/branches/C -m "Creating branch C"
echo delta > %WC_PATH%\delta.txt
svn add %WC_PATH%\delta.txt
svn commit %WC_PATH% -m "Creating delta.txt in trunk"
现在通过从主干合并来同步分支:
svn switch %REPO_URL%/branches/A %WC_PATH%
svn merge %REPO_URL%/trunk %WC_PATH%
svn commit %WC_PATH% -m "Synchronizing branch A with trunk"
svn switch %REPO_URL%/branches/B %WC_PATH%
svn merge %REPO_URL%/trunk %WC_PATH%
svn commit %WC_PATH% -m "Synchronizing branch B with trunk"
svn switch %REPO_URL%/branches/C %WC_PATH%
svn merge %REPO_URL%/trunk %WC_PATH%
svn commit %WC_PATH% -m "Synchronizing branch C with trunk"
在分支 B 和 C 中创建一些不同的内容,以便合并实际上会做一些事情:
svn switch %REPO_URL%/branches/B %WC_PATH%
echo epsilon > %WC_PATH%\epsilon.txt
svn add %WC_PATH%\epsilon.txt
svn commit %WC_PATH% -m "Creating epsilon.txt in B"
svn switch %REPO_URL%/branches/C %WC_PATH%
echo zeta > %WC_PATH%\zeta.txt
svn add %WC_PATH%\zeta.txt
svn commit %WC_PATH% -m "Creating zeta.txt in C"
将我们的工作副本切换回分支A:
> svn switch %REPO_URL%/branches/A %WC_PATH%
D wc\zeta.txt
U wc
Updated to revision 14.
现在,我们准备好将 B 合并到 A 上:
> svn merge %REPO_URL%/trunk %REPO_URL%/branches/B %WC_PATH%
--- Merging differences between repository URLs into 'wc':
A wc\epsilon.txt
G wc
--- Recording mergeinfo for merge between repository URLs into 'wc':
G wc
Sending wc
Adding wc\epsilon.txt
> svn commit %WC_PATH% -m "Merged B to A"
Committing transaction...
Committed revision 15.
> svn update %WC_PATH%
Updating 'wc':
At revision 15.
所以现在 epsilon.txt 在我们的 A 分支中。现在让我们将 C 合并到 A 上:
> svn merge %REPO_URL%/trunk %REPO_URL%/branches/C %WC_PATH%
--- Merging differences between repository URLs into 'wc':
A wc\zeta.txt
G wc
--- Recording mergeinfo for merge between repository URLs into 'wc':
G wc
Sending wc
Adding wc\zeta.txt
> svn commit %WC_PATH% -m "Merged C to A"
Committing transaction...
Committed revision 16.
> svn update %WC_PATH%
Updating 'wc':
At revision 16.
这将 zeta.txt 合并到 A 中,如果我们现在查看 A,我们可以验证:
> svn ls %REPO_URL%/branches/A
alpha.txt
beta.txt
delta.txt
epsilon.txt
gamma.txt
zeta.txt