Слияние филиала в TortoiseSVN с историей - PullRequest
0 голосов
/ 10 мая 2019

Я работаю в простом хранилище, с грузовиком и одной веткой. Со времени ветвления в магистраль не было внесено никаких изменений, и в ветке было сделано несколько коммитов. Как объединить ветку обратно в ствол, чтобы получить полную историю включенных изменений, когда она была в ветке в одной истории?

1 Ответ

0 голосов
/ 15 мая 2019

Обычно в 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] будет последним коммитом исходной ветви.

Как есть и для обеспечения безопасности, этот скрипт только изменяет вашу рабочую копию (WC), выполнив svn merge s, но не выполнив svn commit s.Итак, во-первых, извлеките целевую ветвь (ствол, в вашем случае) в новый 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

Отказ от ответственности: Этот скрипт был вдохновлен этим вариант для linux (который не проверяет наличие пустых ревизий)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...