将TortoiseSVN中的分支与历史合并

时间:2019-05-10 15:16:35

标签: svn merge tortoisesvn

我在一个简单的仓库里工作,有一辆卡车和一个分支。自从分支分支以来,没有对主干进行任何更改,并且在分支分支上进行了许多提交。如何将分支合并回主干,以便在一个历史中将分支中的全部历史记录包含在更改中?

2 个答案:

答案 0 :(得分:0)

通常在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 merge来修改您的工作副本(WC),而不会执行svn commit。因此,首先,将目标分支(在您的情况下为主干)签到新的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(不检查空白修订)

答案 1 :(得分:0)

非常感谢这一批。对我来说很完美!我还有一点点补充: 我把svn update放在svn commit行之后。像这样:

svn commit -F tmp-commit.txt
svn update

否则,每次下一次提交时,SVN都会向您返回一条消息“请在尝试提交到最新版本的WC时更新您的WC”