svn - Как зафиксировать изменения "между двумя ревизиями"? - PullRequest
0 голосов
/ 29 июня 2018

Вопрос:

Как зафиксировать изменения "между двумя ревизиями"?
Я использую кавычки, потому что, очевидно, вы не можете ничего зафиксировать между двумя ревизиями - они уже находятся в репозитории.

Длинная история, то есть зачем мне это нужно?

Поначалу вопрос может показаться неловким, но вот сценарий из реальной жизни, с которым я столкнулся в своей работе.
Мы вносим изменения во время разработки в ветки разработки (или «функциональные ветки», fb, как мы их называем), и когда работа завершена, мы объединяемся в trunk.
Вы знаете, основной рабочий процесс.
Из ствола мы выпускаем наше ПО и соглашаемся заморозить код за несколько дней до фактического выпуска.
Теперь я был достаточно глуп, чтобы доверять нашему кандидату в release (RC), построенному из магистрали, и это хорошо, поскольку все автоматизированные тесты прошли и совершили слияние со стволом до того, как мы фактически выпустили SW. И убрал ветку функции.
Допустим, кандидат на выпуск был в редакции 42, а версия SW, которую мы выпускаем, была v1.0.3. Итак, r42 - это RC для выпуска v1.0.3.
Итак, RC выглядел хорошо, но прежде чем мы выпустили SW, я отправил r43 в багажник. Все тесты в CI прошли, поэтому я пошел и удалил ветку fb14 (ревизия 44).
Оказалось, что RC в конце концов не был хорош и нуждался в исправлении, но v1.0.3 не должен содержать функцию 14 (реализовано в fb14), то есть r43.

То же самое в виде иллюстрированной формы:

==r42=======r43
      ^    /
      |   /
      | fb14
      |
commit fix there to get new RC

Так что мне нужно вернуть r42, зафиксировать что-то и затем вернуть r43.

Хорошо, это легко, правда? Откат к r42:

svn merge -r HEAD:42 .
svn commit -m "Reverted back to RC of v1.0.3"

Реализация необходимого исправления и

svn commit -m "Fixed b0rken feature for v1.0.3"

Тогда мы выпустим SW, и я принесу r43:

svn up
svn merge -c 43 .

Но подождите, это ничего не делает! Я пошел и удалил ветку fb14, так что мне нужно откопать это обратно из SVN и снова объединить его с транком? Конечно, я должен быть в состоянии вернуть R43 как-то обратно.

Так что я вроде как хочу:

    roll back to r42
     -------------
    /             \
==r42=====r43=====r45=====r46=====r47
         /   \            ^      /
   merge/     \           |     /
       /       \         fix   /                   
     fb14       \             /
        |        -------------
        |        bring back changes from r43
        |
     deleted in r44

РЕДАКТИРОВАТЬ: Бу, он отвечает на свой вопрос!
Читать https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/
Я хочу найти это позже, если / когда я снова столкнусь с подобной ситуацией.

1 Ответ

0 голосов
/ 29 июня 2018

Anwser

svn merge -c 43 --ignore-ancestry .
svn commit -m "Introducing feature 14"

Разъяснения

Почему

svn merge -c 43 .

не работает в багажнике?
Из-за родословной .
Допустим, изменения в r43 пошли в файл foo.cpp
svn merge записывает родословную, это основные вещи. С предками мы знаем, как отследить старые версии. Правильно?
Так что при совершении ревизии 43 foo.cpp@42 стал предком foo.cpp@43. Затем я вернулся к r42 и совершил r44, и foo.cpp@43 стал предком foo.cpp@44.
Итак, теперь, находясь в редакции 45, я хочу объединить редакцию 43 в. Но у меня есть слияние foo.cpp@44 с foo.cpp@42, поэтому при базовом слиянии foo.cpp@43 с foo.cpp@45 происхождение получится испортил.
Чтобы foo.cpp@43 стал foo.cpp@45, мне нужно игнорировать происхождение .

svn merge -c 43 --ignore-ancestry .

Дополнительная информация в http://svnbook.red -bean.com / ru / 1.7 / svn.branchmerge.advanced.html # svn.branchmerge.advanced.ancestry

Конечно, то же самое можно было бы получить, выкопав ветку fb14 из катакомбы и сделав еще одно слияние с стволом:

      roll back to r42
    ----------------
   /                \
--r42-----r43-----r45-----r46-----r47
         /                ^      /
        /                 |     /
       /                 fix   /                   
merge fb14---                 /
             \           merge fb14
            delete fb14       

т.е. (в редакции 43)

svn merge -r HEAD:42 .
svn commit -m "Reverted back to RC1 of v1.0.3"

Код, который вы никогда не кодировали раньше, нам нужно немедленно исправить!

svn commit -m "Fixed b0rken feature for v1.0.3"

Запустите CI-машину, чтобы собрать пакеты и выпустить ПО.

svn cp ^/branches/fb14@43 ^/branches/fb14-2
svn up
svn merge --reintegrate ^/branches/fb14-2
svn commit -m "Introducing feature 14"
svn rm ^/branches/fb14-2

Но мне не понравился этот подход, поэтому я прочитал о расширенном слиянии. ;)

...