Почему svn merge --ignore-ancestry не работает дважды в этом сценарии, когда svn diff + patch работает? - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь заменить мой рабочий процесс слияния SVN - обычно svn diff, иногда ручное редактирование патча, а затем patch - фактическим svn merge. Но я вижу какое-то неожиданное поведение и не могу найти объяснения ни в одной документации SVN онлайн. Вот мой сценарий:

  1. Новый репозиторий (рев. 0)
  2. Создан пустой файл с именем file в транке (версия 1)
  3. Скопированный транк в филиалы / branch1 (rev. 2)
  4. В branch / branch1 изменилось file на «abcdefg» и зафиксировано (rev. 3)
  5. Вернувшись в багажник, побежал:

svn merge -c3 ^/branches/branch1 . --ignore-ancestry

Пока все хорошо. file в багажнике содержится "abcdefg". И транк не обновлялся ни с какой mergeinfo, так как я использовал --ignore-ancestry. Чтобы проверить, я запускаю:

svn pg svn:mergeinfo .

который ничего не печатает. Отлично. Итак, теперь я хочу применить изменение в r3 снова . Итак, я бегу:

svn merge -c3 ^/branches/branch1 . --ignore-ancestry

Эта команда ничего не делает 1037 *. Печатает без вывода, не меняет file и не добавляет никакой mergeinfo. Если я сделаю то же самое со своим старым рабочим процессом diff-and-patch, как это:

svn diff -c3 ^/branches/branch1 | patch

Затем файл обновляется с изменением снова. А так как изменение составило всего:

    --- file    (revision 2)
    +++ file    (revision 3)
    @@ -0,0 +1 @@
    +abcdefg

повторное применение просто приводит к тому, что file содержит две строки "abcdefg", как и предполагалось.

* * ~~~ тысяча сорок-девять

Я знаю, что это не должно быть обычным рабочим процессом, но я чувствую, что мне нужно понять, что на самом деле делает svn merge в подобных ситуациях, прежде чем я смогу принять его с комфортом. (Нет необходимости поддерживать преимущества svn merge - я уже на борту.)

Спасибо!

1 Ответ

1 голос
/ 29 марта 2012

Слияние работает путем сравнения двух файлов, чтобы объединить и заставить вас согласовать различия (и при использовании предков, конечно, во много раз легче, когда файлы связаны).Если файлы идентичны, ничего не происходит.Кажется, что Subversion считает, что конфликт между «старым файлом» и «файлом-преемником» выиграл преемник.На любом реальном контенте без правопреемства вы получите конфликт, который нужно исправить с помощью инструмента слияния.--ignore-ancestry может действительно игнорировать свойство svn: mergeinfo, сохраняя при этом информацию о неявном пути на основе истории, когда это помогает тривиально, документация не является явной по этому вопросу.

С другой стороны, ваш рабочий процесс исправления выполняется ипочему он удваивает содержание текста: в отсутствие контекста (хотя контекст требуется в унифицированном формате патча, в вашем случае его вообще нет), patcher считает хорошей идеей повторно применить патч,хотя в данном случае правильным подходом обычно является подход SubVersion.Другой инструмент исправления мог бы заметить отсутствие контекста и рассматривать это как необходимость применения контекста «начало файла» / «конец файла», тогда исправление могло бы быть неудачным.

...