Слияние ветвей в Subversion не приводит к добавлению всех новых файлов. Почему нет?

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

Вот график:

  • Отключите магистраль, чтобы создать ветку dev1.
  • Код в dev1, изменение файлов и добавление файлов.
  • Отключите магистраль, чтобы создать ветку dev2.
  • Исправлена ​​ошибка в dev1, изменяющая файлы, но не добавляющая файлы.
  • Объедините все изменения в dev1 с dev2.

Как и ожидалось, изменений много, включая новые файлы, но не все. Это потому, что диапазон версий, из которых я сливаюсь, включает версию, из которой образовалась ветка dev2? Или мне следует выполнить слияние с основной линией, а затем с dev2?

Изменить: весь код полностью передан в Subversion. Но я думаю, что может случиться так, что добавление файлов не распространяется через слияния. То есть предыдущее слияние с dev1 добавило несколько файлов, но слияние с dev1, которое включает фиксацию от предыдущего слияния не, включает добавленные файлы.

Но я все еще проверяю.


person staticsan    schedule 15.04.2009    source источник


Ответы (6)


Следующее утверждение неверно:

Файлы, которые были добавлены в ветку, а затем изменены в ветке, не добавляются при слиянии нескольких ревизий.

Это означало бы, что слияние полностью нарушено.

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

Еще одна вещь, на которую следует обратить внимание, - это если вы выполните слияние в рабочую копию, а затем решите, что вам это не нравится, и вернете все, вновь добавленные файлы все равно будут в рабочей копии, поэтому, если вы снова выполните слияние, неверсированные файлы предотвратят слияние новых файлов, поэтому вы их пропустите. Таким образом, запуск «svn status» и удаление неверсированных файлов обеспечат правильную работу слияния.

Комментарий о добавлении пустого файла делать не следует, потому что тогда новый файл не имеет истории того, откуда он появился. Другими словами, это не копия, поэтому "svn log" не будет отображать его историю. И, наконец, если бы файл представлял собой гигабайтную фотографию, вы бы не захотели объединять его в новый файл, потому что тогда в репозитории будут две копии одного и того же контекста. Слияние и копирование с историей сохраняет хранилище репозитория (по крайней мере, пока не будет добавлено совместное использование репозитория).

person Blair Zajac    schedule 22.04.2009
comment
В этом есть смысл. Я думаю, мне нужно сделать несколько хитрых слияний ... :-( - person staticsan; 22.04.2009
comment
+1 за указание на то, что svn revert нарушит слияние, это была моя проблема. - person Dean Povey; 10.10.2011
comment
Я не согласен. Когда вы объединяете две ветки и все ревизии. Если в обеих ваших ветвях есть данные в ГБ, то они пропустили много файлов. - person flik; 11.04.2018

Я всегда знал, что предупреждения svn указывают на то, что вы как-то облажались. Затем я столкнулся с вышеупомянутым случаем, когда я получал много пропущенных файлов при слиянии из ветки, но я знал, что у меня есть правильные пути для слияния. Пропущенными файлами были все файлы, которые были добавлены и изменены в ветке, но еще не существовали в магистрали.

Затем я понял, что все эти файлы уже существуют, хотя и не версионированы, на моей рабочей копии ствола - я выполнил тестовое слияние (не пробный запуск) неделей ранее и вернулся, но файлы так и не были физически удалены моим SVN. клиент. Как только я физически удалил их из своей рабочей копии транка, проблема исчезла!

person JasonZ    schedule 19.04.2010
comment
Спасибо, что задокументировали это. Это была моя проблема. - person Craig McQueen; 12.11.2010
comment
Это тоже была моя проблема. Было бы здорово, если бы svn сказал, что эти файлы уже существуют в вашем WC, вместо того, чтобы просто пропустить их без объяснения причин - person Shezan Baig; 16.02.2011
comment
+1 Именно это и произошло со мной (конфликт деревьев, файлы пропускались, файлы не добавлялись - ›снова конфликт деревьев) - person fmuecke; 20.09.2011
comment
Чтобы исправить файлы, оставшиеся после svn revert, я использовал сценарий svnclean из этого ответа - person rescdsk; 05.04.2012
comment
Согласен - «пропущено» недостаточно для описания. Скажи мне, что они уже там! - person Alex; 27.06.2012
comment
Потом я понял, что все эти файлы уже существуют, хотя и неверсированные. это тоже была моя проблема. спасибо, что указали на это (+1) - person magicandre1981; 06.08.2013

Файлы, которые были добавлены в ветку, а затем изменены в ветке, не добавляются при слиянии нескольких ревизий, потому что Subversion пытается применить контекстное различие к файлу, которого нет в рабочем каталоге ( новый файл). Вы увидите предупреждение от svn вроде «Пропуск отсутствующего файла blah.c ...»

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

Другой вариант, который у вас есть, - создать пустые файлы (например, с помощью команды unix touch) для всех файлов, которые были добавлены в версии (вы можете получить список этих файлов, просто выполнив слияние с --dry-run спецификатор и принимая к сведению все предупреждения «Пропуск отсутствующего файла»), затем запустите слияние со всем вашим списком ревизий (например, -r 1023: 1040). Это объединит изменения в новые пустые файлы, и все должно быть красивым :)

person Jason Coco    schedule 15.04.2009
comment
Мне нравится первый трюк с добавлением пустых файлов. Тогда это всего лишь одна дельта со всем содержанием различий. Прохладный. - person Roboprog; 16.04.2009

(Так как это, кажется, главный пост при поиске этой проблемы, я прокомментирую еще одну возможную причину такого же поведения).

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

В этом случае вам следует просто убедиться, что файлы действительно правильно объединены, и продолжить работу в обычном режиме.

person user2580621    schedule 07.04.2014

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

Когда вы сделали все изменения, просто нажмите кнопку добавления файлов в svn, я использую RapidSVN. Это простой в использовании.

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

Вы увидите предупреждение от svn о чем-то вроде «Пропуск отсутствующих файлов ...»

person flik    schedule 11.04.2018

Небольшая работа может вам помочь:

  1. При установке Tortoise SVN не забудьте включить Инструменты клиента командной строки (подробнее здесь).
  2. Создайте пустую папку.
  3. Откройте Блокнот, затем скопируйте приведенные ниже коды и сохраните как Get_all_modified_files.bat
    @echo off set SRC_PATH=%1 set /a COUNTER=1 :SET_DES_DIR set DES_PATH=%SRC_PATH%_%COUNTER% if exist %DES_PATH% ( set /a COUNTER=%COUNTER% + 1 goto :SET_DES_DIR ) :GET_MODIFIED_FILES pushd %1 svn st | find "M" > LIST_FILES for /f "tokens=2" %%b in (LIST_FILES) do ( echo f | xcopy "%SRC_PATH%\%%b" "%DES_PATH%\%%b" ) del LIST_FILES popd pause
  4. Откройте Блокнот, скопируйте приведенные ниже коды и сохраните как Install.bat

    @echo off setlocal enabledelayedexpansion :PREPARE if exist Install.reg del Install.reg if exist Uninstall.bat del Uninstall.bat if exist LIST_FILES del LIST_FILES :GET_DETAIL dir "%0\.." /s /b /o:gn > LIST_FILES set /a COUNTER=1 for /f "tokens=*" %%b in (LIST_FILES) do ( if !COUNTER! == 1 set Get_all_modified_files=%%b set /a COUNTER=!COUNTER! + 1 ) set Get_all_modified_files=!Get_all_modified_files:\=\\! set Get_all_modified_files=@="!Get_all_modified_files! %%1" :CREATE_INSTALL_FILE echo Windows Registry Editor Version 5.00>>Install.reg echo. >>Install.reg echo [HKEY_CLASSES_ROOT\Directory\shell\Get modified files]>>Install.reg echo. >>Install.reg echo [HKEY_CLASSES_ROOT\Directory\shell\Get modified files\command]>>Install.reg echo !Get_all_modified_files!>>Install.reg echo @echo off>Uninstall.bat echo echo yes ^| reg delete "HKEY_CLASSES_ROOT\Directory\shell\Get modified files">>Uninstall.bat echo set ^/p BYE^=Enter any key to exit...>>Uninstall.bat :RUN_AND_REMOVE regedit /s Install.reg if exist Install.reg del Install.reg if exist LIST_FILES del LIST_FILES endlocal :INSTRUCTION echo - Setting done! Using uninstall.bat to remove this feature. echo - In order to use: echo 1.Right-click on which folder you want export files echo 2.Select 'Get modified files' to run command. echo 3.It will create and copy modified files into new folder. set /p BYE=- Hoping it useful! Good bye!

  5. Запустите файл Install.bat от имени администратора, щелкнув правой кнопкой мыши, чтобы добавить эту команду в реестр.

  6. Теперь вы можете получить все измененные файлы, щелкнув правой кнопкой мыши папку SVN, в которой вы хотите получить все файлы, и выберите в меню Получить все измененные файлы.

Надеюсь, мои коды будут вам полезны!

person KhanhNT    schedule 08.06.2018