【问题标题】:Merging Branch in TortoiseSVN with history将 TortoiseSVN 中的分支与历史合并
【发布时间】:2019-09-28 12:46:09
【问题描述】:

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

【问题讨论】:

    标签: svn merge tortoisesvn


    【解决方案1】:

    通常在 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(它不会检查空修订)

    【讨论】:

      【解决方案2】:

      非常感谢这批货。非常适合我!我有一个小补充: 我将 svn update 放在 svn commit 行之后。像这样:

      svn commit -F tmp-commit.txt
      svn update
      

      否则,在每次下一次提交时,SVN 都会返回一条消息“请更新你的 WC,因为你试图提交一个不是最新版本的 WC”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 2010-09-05
        • 2017-12-10
        • 2016-01-11
        • 2014-06-30
        • 1970-01-01
        相关资源
        最近更新 更多