1

将更改从一个分支合并到另一个分支时,在日志中查找相关范围的更改并手动复制消息是很乏味的。TortoiseSVN 确实通过“最近的消息”按钮很好地解决了这个问题,但我必须通过 'svn merge' 来解决这个问题以进行持续集成设置。

我认为这是一个常见问题,但找不到任何解决方案,所以这是我自己的。请随时发布更好的解决方案作为对此的答案。

我的情景

我会定期将 1:HEAD 从 /trunk 合并到 /branches/AutoDeploy。除了合并之外,AutoDeploy 永远不会被提交,所以这应该可以简化事情。我想使用 'svn merge' 或类似的命令行工具进行合并,并且我希望提交消息包含来自合并修订版的所有消息。

该解决方案必须适用于 SVN 和 Windows,但要与其他操作系统兼容才能获得加分。

编辑:拆分问题和答案。

4

1 回答 1

0

我的解决方案

为了通过持续集成触发部署,我运行了一个批处理脚本,该脚本合并来自主干的最新更改,检索相关日志消息并提交这些消息。

脚本是这样的:

  • 使用 svnversion 和 sed.exe + regex 获取分支的修订版本。
  • 从分支修订获取主干的日志消息到 HEAD,保存到 messages.txt。
  • 将主干合并到分支中。
  • 使用 --file messages.txt 提交。

文件夹结构

/trunk
/branches/AutoDeploy
/branches/AutoDeploy/AutoDeployTools
/branches/AutoDeploy/AutoDeployTools/Merge_from_trunk.bat
/branches/AutoDeploy/AutoDeployTools/sed.exe
/branches/AutoDeploy/AutoDeployTools/current_rev.txt*
/branches/AutoDeploy/AutoDeployTools/messages.txt*

* 为每次合并生成的临时文件。

Merge_from_trunk.bat

@echo off

del *.txt
SET MessagesFile=messages.txt
SET CurrentRevFile=current_rev.txt
SET RepoUrl=svn://<host>
SET LocalBranchPath=../

REM CD %LocalBranchPath%

REM Get current revision for branch. Typically formatted as "683:684".
echo|set /p=Getting current revision for branch...
svnversion -c -n %LocalBranchPath% /branches/AutoDeployWeb > %CurrentRevFile%

REM Strip away number before colon (683:684 => 684)
sed -i s/.*\:// %CurrentRevFile%

REM Strip away any characters that indicate Modified (M), Switched (S) etc.
sed -i s/[a-zA-Z]// %CurrentRevFile%

SET /p BranchRev=<%CurrentRevFile%
echo DONE! 
echo Current revision in AutoDeployWeb is %BranchRev%.

REM Retrieve relevant log messages for this merge.
echo|set /p=Getting log messages for revisions %BranchRev%:HEAD...
svn log %RepoUrl%/trunk -r %BranchRev%:HEAD > %MessagesFile%
echo DONE!

REM Merge
echo Merging...
svn up %LocalBranchPath%
svn merge svn://dev.swingcatalyst.com/SC_Online/trunk %LocalBranchPath%
echo Merging DONE!

REM Commit
echo|set /p=Committing...
echo Commit message:
type %MessagesFile%
svn commit --file %MessagesFile% %LocalBranchPath%
echo DONE!
pause

已知限制

  • 当前的实现不允许您向提交消息添加文本,但这应该很容易添加。
  • 如果分支被提交到,除了合并之外,它会导致 svnversion 不包括在最后一个分支提交之前来自修订的日志消息。对此有解决方案,例如解析 svn merge 文本输出而不是使用 svnversion。

编辑:添加了另一个已知限制。编辑:将 sed.exe 添加到文件夹结构中。

于 2013-01-10T08:31:30.437 回答