【发布时间】:2019-09-28 12:46:09
【问题描述】:
我在一个简单的存储库中工作,有一辆卡车和一个分支。自分支以来没有对主干进行任何更改,并且在分支上进行了许多提交。如何将分支合并回主干,以便在一个历史记录中的分支中获取包含更改的完整历史记录?
【问题讨论】:
标签: svn merge tortoisesvn
我在一个简单的存储库中工作,有一辆卡车和一个分支。自分支以来没有对主干进行任何更改,并且在分支上进行了许多提交。如何将分支合并回主干,以便在一个历史记录中的分支中获取包含更改的完整历史记录?
【问题讨论】:
标签: svn merge tortoisesvn
通常在 Subversion 中,将整个范围合并到一个提交中,就像 git 中的壁球合并:
svn merge -r[REVISION1]:[REVISION2] svn://[REPO-URL]/[BRANCH] [TRUNK-DIR]
从 Subversion 1.5 开始,有关各个原始提交的信息保留在 svn:mergeinfo 属性中。在 TortoiseSVN 中,您可以在菜单项“属性”下找到这些。在命令行中,您可以按如下方式查询该信息:
svn propget "svn:mergeinfo" [PATH]
如果您真的希望每次原始提交都有一个合并提交,您需要自己做这些 - 我认为这很痛苦,尤其是使用 TortoiseSVN。
或者,您可以使用脚本为您执行提交。由于您使用的是 TortoiseSVN,我确定您使用的是 Windows,因此我创建了一个快速批处理文件来完成这项工作。它将遍历一系列修订,检查源分支是否确实具有该修订,如果是,它将首先合并它,然后将其与原始提交消息的副本一起提交。 [REVISION1] 将是源分支的第一次提交,[REVISION2] 将是源分支的最后一次提交。
为了保证安全,此脚本仅通过执行svn merges 修改您的工作副本 (WC),但不执行svn commits。因此,首先,将目标分支(在您的情况下为主干)检出到一个新的 WC 中,并检查该脚本是否按预期运行 - 即是否只有相关修订版合并到 WC 中。如果是这样,请再次将目标分支检出到另一个新的 WC 中,并删除脚本中最后一个 REM 以激活提交。
@ECHO OFF
REM inspired by https://stackoverflow.com/a/6192099/1529709
SETLOCAL EnableDelayedExpansion
SET BRANCH=svn://[REPO-URL]/[BRANCH]
FOR /L %%G IN ([REVISION1],1,[REVISION2]) DO (
REM check if log is empty and only merge if not
svn log -c %%G %BRANCH% > tmp-log.txt
FINDSTR /V "\-----------" tmp-log.txt > NUL
IF NOT ERRORLEVEL 1 (
ECHO Merging revision %%G
ECHO merge commit from %BRANCH% > tmp-commit.txt && ECHO. >> tmp-commit.txt
TYPE tmp-log.txt >> tmp-commit.txt
svn merge -c %%G %BRANCH% .
REM *** check results first before you activate committing! ***
REM svn commit -F tmp-commit.txt
) ELSE (
ECHO Skipping revision %%G
)
)
IF EXIST tmp-commit.txt DEL tmp-commit.txt
IF EXIST tmp-log.txt DEL tmp-log.txt
免责声明:此脚本的灵感来自 variant for linux(它不会检查空修订)
【讨论】:
非常感谢这批货。非常适合我!我有一个小补充: 我将 svn update 放在 svn commit 行之后。像这样:
svn commit -F tmp-commit.txt
svn update
否则,在每次下一次提交时,SVN 都会返回一条消息“请更新你的 WC,因为你试图提交一个不是最新版本的 WC”
【讨论】: