Обновить svn checkout до определенной даты, включая внешние данные



Я хочу выполнить обновление svn до определенной даты, и я могу сделать это с помощью svn update -r {2010-10-17}. К сожалению, когда это встречается с внешним, он будет делать обновление внутри внешнего, не проходя через опцию -r {2010-10-17}. Это приводит к тому, что мы получаем правильную прошлую ревизию базового кода, но последние (нежелательные) версии многих внешних компонентов.



Как я могу обновить до определенной ревизии или даты и правильно выполнить эту рекурсию через внешние компоненты?



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

634   3  

3 ответов:

Я надеюсь, что кто-нибудь рано или поздно воплотит мою логику здравого смысла (ограниченную внешними каталогами в некоторых областях) в bash и cmd-скрипт, и мы получим "окончательный ответ" на этот повторяющийся вопрос

Ваша основная задача:

  • svn up ваше суперрепо до нужной точки в прошлом (обновление до даты /и без времени/, кстати, не лучший выбор, но-применимо)
  • получить список путей ко всем внешним объектам в вашем проекте (потому что определения внешних объектов может существовать в любом месте дерева), от WC-root svn propget svn:externals -R (-R для проверки всего дерева без множества cd)
  • для каждой строки в выводе propget (с форматом, подобным этому . - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib): cd к последнему полю строки /относительно первого поля, которое, в свою очередь, является относительным путем к корню / и svn до той же точки, как это было сделано для superrepo: svn update -r {2010-10-17}

В результате вы получите смешанную рабочую копию, но superrepo и externals будут находиться в состоянии " для некоторой ревизии в прошлое "

Примечание:

Дополнительный пример для построения локального пути к каталогу с внешними элементами (вложенными WC) на более сложном примере.

Для

>svn propget svn:externals -R
tags\1.0.1 - -r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib@2 lib

trunk - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib

Конечные пути к внешним элементам в моем WC будут (относительно WC-root)

tags\1.0.1\lib
trunk\lib

Я добавляю этот ответ на случай, если кто-то пытается обновить уже проверенный репозиторий subversion, чтобы синхронизировать даты локальных файлов с датами РЕПО, что я хотел сделать, чтобы я мог сделать сравнение временных меток FS.

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

svn info --show-item last-changed-date -R | xargs -I{} -P1000 -n1 sh -c 'x="{}"; set -x; exec touch -d "${x%% *}" "${x#* }"'

Примечание: -P1000 указывает, что xargs должен выполняться 1000 одновременные копии sh и touch для выполнения фактического обновление. В зависимости от нагрузки на систему это может быть разумно снизить. На крошечном i3-процессоре Intel NUC 1000 процессы на самом деле оказались идеальными, используя 80-95% CPU (100% обычно означает, что процессор перегружен). Если сомневаетесь, откройте eg htop и тестируйте с разными значениями - но только запускайте его в течение нескольких секунд, потому что он должен будет запускаться с самого начала каждый раз.

Для небольшого РЕПО SVN объемом ~3 ГБ на жестком диске USB это заняло около 5 минут.

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

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

Comments

    Ничего не найдено.