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