Подтвердить что ты не робот

Subversion объединяет изменения из другого репозитория

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

Там есть внешний репозиторий, содержащий некоторый сторонний код. Я хочу взять копию версии 1 кода и поместить ее в свой собственный репозиторий, а затем настроить ее для моих собственных нужд. Когда версия 2 этого кода выпущена, я хочу иметь возможность обновить свою измененную версию со всеми изменениями версии 2, сохраняя мои настройки.

Я читал о ветвях поставщиков (http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html), но я не понимаю, почему слияние предыдущей копии кода поставщика и новая копия кода поставщика должна быть настолько сложной (т.е. svn_load_dirs.pl). Разумеется, если сторонний код хранится в репозитории SVN, вся история, в отношении которой были перемещены/удалены файлы, известна, почему вам нужно сообщить, что изменилось вручную?

Цитата:

Например, у вас будет возможность сообщить script, что вы знаете, что файл math.c в версии 1.0 libcomplex был переименован в arithmetic.c в libcomplex 1.1.

Я также прочитал (http://svn.haxx.se/users/archive-2006-04/0285.shtml), что можно просто запустить слияние между различными репозиториями, но я не сделал думаю, что это было возможно, и всякий раз, когда я это пробовал, он терпел неудачу (хотя я мог что-то делать не так).

Может ли кто-нибудь прояснить это для меня и предложить наилучшее решение?

Спасибо, Джек

4b9b3361

Ответ 1

Я только что попробовал короткий эксперимент с TortoiseSVN:

Создание тестовых репозиториев

  • создать два новых репозитория в rep1 и rep2
  • проверить rep1 в co1
  • добавить текстовый файл в co1 и проверить его в
  • экспорт rep1 в ex1
  • import ex1 в rep2

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

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

Слияние изменений

Теперь, чтобы создать свою собственную рабочую копию, проверьте rep2 на co2.

Мы должны быть готовы попробовать слияние с rep1 в co2.

Откройте диалоговое окно слияния для co2 и наведите его на rep1.

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

Для пересмотра 'to' выберите HEAD или последнее обновление, которое вы хотите применить.

Результаты

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

Ответ 2

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

Проблема заключается в том, что Subversion действительно не обеспечивает прямую поддержку переименований файлов и перемещений файлов между каталогами для последовательного обновления из кода поставщика, потому что вы просто получаете моментальные копии содержимого исходных файлов.... что-то нужно для запуска команд в систему версий, чтобы указать, какие изменения вносятся в дерево имен файлов, которые составляют новую версию. Это цель процесса svn_load_dirs.pl script. Это поможет вам изменить историю версий, чтобы они соответствовали ветвям, чтобы затем вы могли продолжить слияние. Если поставщик не переименовал и не переместил файлы между импортированными вами версиями, у вас не возникло бы этой проблемы.

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

Ответ 3

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

svn merge ORIGINAL @REV UPGRADE @REV LOCAL_PATH

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

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