Слияние ветвей в Subversion не добавляет все новые файлы. Почему бы и нет? - PullRequest
23 голосов
/ 16 апреля 2009

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

Вот график времени:

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

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

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

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

Ответы [ 6 ]

29 голосов
/ 19 апреля 2010

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

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

28 голосов
/ 22 апреля 2009

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

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

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

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

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

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

1 голос
/ 16 апреля 2009

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

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

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

0 голосов
/ 08 июня 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, в которой вы хотите получить все файлы, и выберите Получить все измененные файлы в меню.

Надеюсь, мои коды вам пригодятся!

0 голосов
/ 11 апреля 2018

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

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

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

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

0 голосов
/ 07 апреля 2014

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

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

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

...