Слияние между ветвями в Subversion не добавляет все новые файлы. Почему бы и нет?

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

вот временная линия:

  • ветвь от ствола для создания ветви dev1.
  • код в dev1, изменение файлов и добавление файлов.
  • ветвь от ствола для создания ветви dev2.
  • исправление ошибок в dev1, изменение файлов, но не добавление файлов.
  • объединить все изменения в dev1 на dev2.

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

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

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

6 ответов


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

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

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

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

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

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


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

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


файлы, которые были добавлены в ветку, а затем изменены в ветке, не добавляются при слиянии в ряде ревизий, потому что subversion пытается применить контекстное различие к файлу, который не существует в рабочем каталоге (новый файл). Вы увидите предупреждение от svn, в котором говорится что-то вроде "пропуск отсутствующего файла blah.с..."

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

другой вариант, который у вас есть, - создать пустые файлы (например, с помощью команды Unix touch) для всех файлов, которые были добавлены в ревизии (вы можете получить список этих файлов, просто выполнив слияние с -- dry-run спецификатором и приняв к сведению все " пропуск предупреждения "отсутствует файл"), затем запустите слияние со всем списком версий (например,- r 1023:1040). Что позволит внести изменения в новые пустые файлы и все должно быть замечательно :)


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

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

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


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

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

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

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


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

  1. при установке Tortoise SVN не забудьте включить инструменты клиента командной строки (более подробно здесь).
  2. создайте пустую папку.
  3. откройте блокнот, затем скопируйте коды ниже и сохраните как Get_all_modified_files.летучая мышь!--7-->
    @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. откройте блокнот, затем скопируйте коды ниже и сохраните как установить.летучая мышь!--7-->

    @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. Run установить.летучая мышь!--7--> файл с Администратором щелкните правой кнопкой мыши, чтобы добавить в реестр эту команду.

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

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