Обновите svn checkout до определенной даты, включая внешние - PullRequest
8 голосов
/ 17 ноября 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 28 марта 2013

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

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

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

В результате у вас будет смешанная рабочая копия, но суперрепо и внешние элементы будут в состоянии «для некоторой ревизии в прошлом»

Примечание:

Дополнительный пример для построения локального пути к каталогу с внешними (действительно вложенным 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)

tags\1.0.1\lib
trunk\lib
0 голосов
/ 28 июня 2019

Мы включаем только целые каталоги в другие проекты:

  • mainprj / bin / subprj1
  • mainprj / bin / subprj2
  • mainprj / дата / subprj1
  • mainprj / дата / subprj2
  • subprj1 / bin # включеныв mainprj / bin / subprj1
  • subprj1 / dat #, включенных в mainprj / dat / subprj1
  • subprj2 / bin # входит в mainprj / bin / subprj2
  • subprj2 / dat # входит в mainprj / dat / subprj2

с этим макетом svn propget svn:externals -R возвращает

# cd mainprj
# svn propget svn:externals -R
bin - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/bin
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/bin

dat - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/dat
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/dat

, и вы можете обновить до фиксированной даты следующим образом:

svn propget svn:externals -R |\ 
   grep -vE '^$' | sed -e "s/^[^-]* - //" |\
   while read line; do \
      pushd ${line##*/}; \
         svn update -r {2019-04-26} ${line%% *}; \
      popd; \
   done
0 голосов
/ 02 сентября 2017

Я добавляю этот ответ на случай, если кто-нибудь попытается обновить уже извлеченный репозиторий 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 для фактического обновления , В зависимости от загрузки системы может быть целесообразно уменьшить это. На крошечном процессоре Intel NUC 1000 на базе i3 процессы оказались действительно безупречными, при этом использовалось 80-95% ЦП (обычно 100% означает, что ЦП перегружен). Если сомневаетесь, откройте, например, htop и протестируйте с другими значениями - но запустите его только на несколько секунд, потому что он должен запускаться каждый раз с самого начала.

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

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

0 голосов
/ 17 ноября 2010

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

...