Обновить svn checkout до определенной даты, включая внешние данные
Я хочу выполнить обновление svn до определенной даты, и я могу сделать это с помощью svn update -r {2010-10-17}. К сожалению, когда это встречается с внешним, он будет делать обновление внутри внешнего, не проходя через опцию -r {2010-10-17}. Это приводит к тому, что мы получаем правильную прошлую ревизию базового кода, но последние (нежелательные) версии многих внешних компонентов.
Как я могу обновить до определенной ревизии или даты и правильно выполнить эту рекурсию через внешние компоненты?
(Примечание: I поймите, что ошибка здесь, возможно, заключалась в использовании внешних функций без указания явных ревизий.)
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% обычно означает, что процессор перегружен). Если сомневаетесь, откройте eghtopи тестируйте с разными значениями - но только запускайте его в течение нескольких секунд, потому что он должен будет запускаться с самого начала каждый раз.Для небольшого РЕПО SVN объемом ~3 ГБ на жестком диске USB это заняло около 5 минут.
set +xвключает многословное выполнение, которое Я делаю это непосредственно перед выполнениемtouch, так что вы можете посмотреть, как он работает. Если требуется выполнение без подробностей, удалите эту команду.
Насколько мне удалось выяснить, вы не можете сделать это, не изменив конфигурацию внешних устройств. Но изменение конфигурации externals меняет ее для всех, так что это всего лишь одна фиксация и обновление, и вы закончили.
Comments