Скопируйте сообщения журнала SVN при слиянии с помощью «svn merge»

При слиянии изменений из одной ветки в другую утомительно искать изменения в журнале для соответствующих диапазонов и вручную копировать сообщения. TortoiseSVN довольно хорошо решает эту проблему с помощью кнопки «Последние сообщения», но мне пришлось решить эту проблему с помощью «слияния svn» для настройки непрерывной интеграции.

Я думал, что это распространенная проблема, но не смог найти никаких решений, поэтому вот мое собственное. Пожалуйста, не стесняйтесь публиковать лучшие решения в качестве ответов на этот вопрос.

Мой сценарий

Я периодически хочу объединить 1:HEAD из /trunk в /branches/AutoDeploy. AutoDeploy никогда не будет зафиксирован, за исключением слияний, так что это должно упростить ситуацию. Я хочу объединить с помощью «svn merge» или аналогичного инструмента командной строки, и я хочу, чтобы сообщение фиксации включало все сообщения из объединенных ревизий.

Решение должно работать для SVN и Windows, но получать бонусы за совместимость с другими операционными системами.

Изменить: Разделить вопрос и ответ.


person angularsen    schedule 10.01.2013    source источник
comment
Лучше переформулировать этот вопрос в вопрос и ответ.   -  person Yan Sklyarenko    schedule 10.01.2013


Ответы (1)


Мое решение

Чтобы инициировать развертывание посредством непрерывной интеграции, я запускаю пакетный сценарий, который объединяет последние изменения из магистрали, извлекает соответствующие сообщения журнала и фиксирует эти сообщения.

Скрипт выглядит примерно так:

  • Получить ревизию ветки с помощью 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*

* Временные файлы создаются для каждого слияния.

Объединить_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 в структуру папок.

person angularsen    schedule 10.01.2013