Конфликт дерева TortoiseSVN: невозможно выбрать удаленный файл

Вот сценарий:

  • User1, Branch1: добавляет abc.def; совершает.
  • User2, Branch2: добавляет abc.def (то же имя файла, но больше деталей в файле); совершает.

Теперь User1 хочет объединить обновленную версию файла «abc.def». Итак (используя TortoiseSVN 1.7.10), Пользователь1 запускается в Рабочей копии Branch1, выбирает Merge... -> Reintegrate a Branch, затем выбирает Branch2 и выбирает Merge. Как и следовало ожидать, в результате будет "конфликт деревьев" с таким текстом:

Последняя операция слияния попыталась добавить файл abc.def из Branch2, но файл уже был добавлен локально. Как вы хотите разрешить этот конфликт?

Но единственный выбор - это одна кнопка с надписью Keep the local file. Нет возможности выбрать удаленный файл, который действительно нужен пользователю User1.

введите описание изображения здесь

Что я здесь делаю не так и как это исправить? В частности, как мне получить версию файла User2 в Branch1?

(Конечно, я уверен, что User1 мог бы вручную удалить файл перед слиянием, но это уничтожит любую историю, которую User1, возможно, хотел сохранить. Плюс это просто неуклюжий рабочий процесс, особенно когда в этой затруднительной ситуации имеется множество файлов.)

К сожалению, этот сценарий даже не упоминается в документации TortoiseSVN по конфликтам деревьев.

ОБНОВЛЕНИЕ:

В дополнение к выбору «Reintegrate a Branch» я также пробовал «Merge a Range of Revisions» и «Merge two different trees». В последнем случае я выбрал удаленную ветвь (Branch2) в качестве «Start», а локальную ветвь - в качестве цели (Branch1; выбор версии до для добавления файла). Я получил одинаковый результат во всех случаях: конфликт дерева без возможности выбора версии файла User2.

ОБНОВЛЕНИЕ №2:

Согласно документации, должен быть «флажок в диалоговом окне выполнения слияния с именем Merge non-interactive», который, если не отмечен, якобы открывает «Диалог обратного вызова конфликта слияния» во время слияния. Однако я не могу найти такой флажок в процессе слияния. Где это находится?


person kmote    schedule 22.05.2017    source источник
comment
У вас есть возможность принудительно выполнить слияние? (Я использую 1.9, поэтому я не уверен, изменился ли он). Кроме того, когда вы говорите, что User1 добавил файл в ветку, вы имеете в виду, что SVN добавлен / зафиксирован или только что создан локально?   -  person user812786    schedule 09.06.2017
comment
@whrrgarbl: Нет, я не могу принудительно выполнить слияние. Это проблема. Вы хотите сказать, что в версии 1.9 этот сценарий разыгрывается по-другому? Что касается вашего второго вопроса: как User1, так и User2 создают файл и добавляют / фиксируют. (Обновил мой пост, чтобы уточнить.)   -  person kmote    schedule 09.06.2017
comment
@whrrgarbl: Если это правда, что 1.9 исправила этот недостаток, и вы можете продемонстрировать снимок экрана с появившимся диалоговым окном слияния, я буду рад наградить вас наградой.   -  person kmote    schedule 09.06.2017
comment
Спасибо за разъяснения! В 1.9 диалоговое окно слияния включает флажок «Принудительное слияние» ... но, к сожалению, он не работает так, как я думал в этом сценарии (каким-то образом он изменяет файл, но все еще имеет версию Branch1 ??). Хм!   -  person user812786    schedule 09.06.2017


Ответы (3)


Мне удалось выполнить слияние из одной ветки в другую в TortoiseSVN версии 1.9 с помощью следующей процедуры.

Настройка

С тестовым репозиторием я проделал следующие шаги:

  1. Создайте ветку "сначала"

  2. Создайте файл "doc.txt" с содержанием "ПЕРВЫЙ" в новой ветке  первый документ

  3. Добавьте и зафиксируйте файл в новой ветке

  4. Создайте ветку "второй"

  5. Создайте файл "doc.txt" с содержанием "ВТОРОЙ" в этой ветке  второй документ

  6. Добавьте и зафиксируйте файл в новой ветке

Итак, моя структура выглядит так:

branches/
    first/
        doc.txt => "FIRST"
    second/
        doc.txt => "SECOND"

Слияние

В этом примере моя цель - поместить содержимое second/doc.txt в первую ветку.

  1. Щелкните правой кнопкой мыши папку ветки first и выберите TortoiseSVN> Объединить ...

  2. Выберите «Объединить два разных дерева»
     диалоговое окно слияния

  3. В поле «От» укажите URL-адрес для /branches/first, а в поле «Кому» укажите URL-адрес для /branches/second.
    введите описание изображения здесь
    (Здесь я споткнулся изначально - я думал, будет наоборот! Документы объясняют:" Это может звучать неправильно, но помните, что ствол - это начальная точка, в которую вы хотите добавить изменения ветки. ")

  4. Нажмите «Далее» и попробуйте выполнить тестовое слияние, если хотите. Он должен показать, что "doc.txt" заменен без конфликтов деревьев. В этом примере параметры слияния по умолчанию подходят.
     параметры слияния

  5. Выполните слияние и проверьте содержимое first/doc.txt - теперь он должен читать «ВТОРОЙ».
    < img src = "https://i.stack.imgur.com/yhXqE.png" alt = "объединить результаты">

  6. Запустите обновление, а затем зафиксируйте папку first, чтобы сохранить слияние в репозиторий!
    результаты фиксации

Полный журнал:
 журнал репозитория

person user812786    schedule 09.06.2017
comment
Что ж, боюсь, я не могу воспроизвести ваши результаты. Я пробовал несколько раз. В первый раз я не выбрал Force Merge, и у меня возник конфликт деревьев. Во второй раз я убедился, что выбрал «Принудительное слияние», и в результате появилось сообщение о том, что СКАЗАНО он заменил файл, но содержимое все еще было из первой ветки. - person kmote; 09.06.2017
comment
Я пошел дальше и наградил вас наградой, потому что она все равно истекала. У меня нет времени над этим сегодня вечером, но завтра я снова поиграю с вашими инструкциями. Спасибо за ваши усилия! - person kmote; 09.06.2017
comment
@kmote Хм, вы позаботились о том, чтобы названия веток были в правильном порядке? Это случилось и со мной, прежде чем я понял, что они были противоположны. - person user812786; 09.06.2017
comment
О боже, спасибо! Я сделаю все возможное, чтобы завтра сделать вам скриншоты, если это поможет :) - person user812786; 09.06.2017
comment
@kmote Я просто переделал упражнение и сделал скриншоты, плюс некоторые исправления. Надеюсь, теперь это сработает, извините за задержку! - person user812786; 12.06.2017

Повторно интегрировать ветку или объединить диапазон ревизий

Я думаю, что вы хотите сначала объединить ряд ревизий, а затем снова объединить ветвь с деревом.

person James Poag    schedule 30.05.2017
comment
Нет, я по-прежнему получаю те же результаты: диалоговое окно «Конфликт дерева» по-прежнему не дает возможности заменить локальный файл на удаленный из другой ветки. - person kmote; 30.05.2017

Появится диалог под названием

Диалог обратного вызова при конфликте слияния

введите описание изображения здесь

Относительно этой проблемы:

диалоговое окно обратного вызова конфликта слияния должно появиться - при слиянии нескольких ревизий с помощью «Объединить диапазон ревизий» - при слиянии с помощью «Реинтегрировать ветку»

на данный момент диалог обратного вызова конфликта слияния появляется только в первом случае.

Он будет включен в предстоящий выпуск 1.6.0.

Это позволяет вам выбрать изменение репозитория вместо вашего

person Damián Rafael Lattenero    schedule 02.06.2017
comment
Я уже использую версию 1.7, поэтому я боюсь, что этот ответ (вместе с веткой, на которую вы ссылаетесь), к сожалению, не касается моей ситуации. - person kmote; 05.06.2017