1

あるブランチから別のブランチに変更をマージする場合、関連する範囲のログで変更を検索し、メッセージを手動でコピーするのは面倒です。TortoiseSVN は「最近のメッセージ」ボタンを使用してこれをかなりうまく解決しますが、継続的インテグレーションのセットアップのために「svn マージ」を使用してこれを解決する必要がありました。

これはよくある問題だと思いましたが、解決策が見つからなかったので、ここに私自身の問題があります。これに対する回答として、より良い解決策を自由に投稿してください。

私のシナリオ

定期的に 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 は最後のブランチ コミットの前のリビジョンからのログ メッセージを含めません。これには、svnversion を使用する代わりに svn マージ テキスト出力を解析するなどの解決策があります。

編集:別の既知の制限を追加しました。編集:フォルダー構造にsed.exeを追加しました。

于 2013-01-10T08:31:30.437 に答える