将乌龟的分支与历史合并



我在一个简单的存储库中工作,带有卡车和一个分支。自分支机构以来,没有对树干进行任何更改,并且分支机构已经做出了许多提交。我如何将分支合并回树干,以便在一个历史记录中的分支机构中获得完整的历史记录?

通常在颠覆中,整个合并范围范围为单个提交,例如壁球合并在git中:

svn merge -r[REVISION1]:[REVISION2] svn://[REPO-URL]/[BRANCH] [TRUNK-DIR]

自颠覆1.5以来,有关单个原始提交的信息保留在svn:mergeinfo属性中。在Tortoisesvn中,您可以在菜单项"属性"下找到这些。在命令行上,您可以如下查询该信息:

svn propget "svn:mergeinfo" [PATH]

如果您真的想每个原始提交单一合并提交,则需要自己做这些 - 我想这会很痛苦,尤其是在Tortoisesvn中。

另外,您可以使用脚本为您完成提交。由于您使用的是Tortoisesvn,因此我确定您正在使用Windows,因此我为快速批处理文件进行了工作来完成这项工作。它将循环通过一系列修订,检查源分支实际上是否具有该修订,如果是的,则首先将其合并,然后用原始提交消息的副本进行提交。[REVISION1]将是源分支的第一个提交,[REVISION2]将是源分支的最后一个提交。

按原样,要确保事情安全,此脚本仅通过执行svn merge S来修改您的工作副本(WC(,但不执行svn commit s。因此,首先,将目标分支(在您的情况下(结帐,并检查该脚本是否按预期运行 - 即仅将相关的修订合并到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

免责声明:此脚本是受Linux变体的启发(不检查空修订版(

非常感谢此批次。对我来说是完美的!我有一个小的补充:我将SVN更新放在SVN提交行之后。这样:

svn commit -F tmp-commit.txt
svn update

否则,下一个下一个提交SVN的每个提交都会返回您的消息"请更新WC,因为您试图将其提交为不是最新修订的WC"

最新更新