SVN напрямую к смоле

13717
monksy

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

14
Я не знаю насчет svn, но github позволяет вам скачивать .tar.gzs из git-репо. Macha 14 лет назад 0

7 ответов на вопрос

12
nedned

Самый простой способ сделать копию последней версии репозитория без всех папок .svn - это использовать svn exportкоманду.

Вот как бы я сделал архив:

$ svn export URL PATH ; tar czf exported_copy.tgz PATH 

Где URL - это URL-адрес вашего хранилища svn, а PATH - локальный путь, подходящий для сохранения копии экспортированного хранилища. Я не знаю способ сделать это более прямо, чем это. К сожалению, вы в конечном итоге получаете экспортированную копию, поэтому вам может понадобиться поместить все это в короткий скрипт bash, который затем удаляет временные файлы.

РЕДАКТИРОВАТЬ: Хотя это самый простой метод и то, что я использовал, я был бы осторожен. В своем исследовании я обнаружил этот http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn, который ясно говорит нам о проблеме сохранения групповой / пользовательской собственности, которая вызывает проблемы при развертывании на другой система. Я пробовал этот сценарий с моими модификациями, чтобы соответствовать моим целям, и вы могли бы также извлечь выгоду

11
Deverne

Возможно, версия 1.23 tar позволяет исключить все файлы версий из командной строки, но, к сожалению, не работает на моей версии 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/ 
Очень хорошо! Я не знал об [этом варианте] (http://www.gnu.org/software/tar/manual/html_section/exclude.html#IDX406). Peter Murray 14 лет назад 0
4
Cristian Ciupitu

Перейдите в рабочий каталог Subversion (извлечение) и запустите это:

find -name .svn -prune -o -print | cpio -o -H tar | gzip > archive.tar.gz 

Если вы используете утилиты GNU, вы также можете запустить:

find -name .svn -prune -o -print0 | cpio -o -0 -H tar | gzip > archive.tar.gz 

Если возможно, я бы порекомендовал использовать формат ustar ( -H ustar).

3
Deverne

Я также вижу:

tar cvfz archive.tar.gz directory/ --exclude='*/.svn' 

Спасибо, смола.

2
warren

Если я правильно понимаю, вы хотите оценить результаты проверки svn?

Итак, в псевдокоде это будет выглядеть примерно так:

svn export branch; find branch | grep -v '/.' | xargs cp tarbranch ; tar -zcf tarbranch.tgz tarbranch 
0
np trivial

This is adapted from a one-liner I wrote. It assumes you have a ~/tmp directory. You'll need to change the PROJ and URL variables in the first two steps. The rest should work.

For easy copying:

PROJ='yourproj' && URL='http://svn.example.com/svn/repo/$PROJ' && REV=`svn info $URL | fgrep Revision | cut -d ' ' -f 2` && cd ~/tmp && svn export $URL $PROJ && tar czv -f $PROJ.r$REV.tar.gz $PROJ && rm -r $PROJ.r$REV 

For easy viewing:

PROJ='yourproj' && URL='http://svn.example.com/svn/repo/$PROJ' && REV=`svn info $URL | fgrep Revision | cut -d ' ' -f 2` && cd ~/tmp && svn export $URL $PROJ && tar czv -f $PROJ.r$REV.tar.gz $PROJ && rm -r $PROJ.r$REV 
0
Explorer09

Это моя попытка сделать детерминированный тарбол из репозитория SVN.

Требуется GNU tar 1.27 или более поздняя версия.

Особенности:

  • Детерминированный тарбол
  • Точность отметки времени в микросекундах из SVN благодаря paxрасширенному заголовку
  • Идентификатор ревизии хранится в комментариях архива, как если git archiveбы
  • Я демонстрирую оба .tar.gzи .tar.xzсжатия. Для Gzip, вы можете оптимизировать сжатие дальше, используя advdefиз AdvanceCOMP ( advdefиспользует zopfli библиотеку).

В качестве примера я использую сам репозиторий Subversion в качестве источника для оформления заказа и создания архива. Обратите внимание, что это не тот способ, которым SVN упаковывает свои tarballs, и я никак не связан с разработкой SVN. В конце концов, это всего лишь пример .

# URL of repository to export url="https://svn.apache.org/repos/asf/subversion/tags/1.9.7/" # Name of distribution sub-directory dist_name=subversion-1.9.7-test # ---------------------------------------------------------------------  info=$(svn info --xml "$url" | tr -- '\t\n' ' ') revision=$(echo "$info" | sed 's|.*<commit[^>]* revision="\\([^">]*\)"\>.*|\1|') tar_name=$-r$ # Subversion's commit timestamps can be as precise as 0.000001 seconds, # but sub-second precision is only available through --xml output # format. date=$(echo "$info" | sed 's|.*<commit[^>]*>.*<date>\([^<]*\)</date>.*</commit>.*|\1|')  # Factors that would make tarball non-deterministic include: # - umask # - Ordering of file names # - Timestamps of directories ("svn export" doesn't update them) # - User and group names and IDs # - Format of tar (gnu, ustar or pax) # - For pax format, the name and contents of extended header blocks  umask u=rwx,go=rx svn export -r "$revision" "$url" "$dist_name" # "svn export" will update file modification time to latest time of # commit that modifies the file, but won't do so on directories. find . -type d | xargs touch -c -m -d "$date" --  trap 's=$?; rm -f "$.tar" || : ; exit $s' 1 2 3 15 # pax extended header allows sub-second precision on modification time. # The default extended header name pattern ("%d/PaxHeaders.%p/%f") # would contain a process ID that makes tarball non-deterministic. # "git archive" would store a commit ID in pax global header (named # "pax_global_header"). We can do similar. # GNU tar (<=1.30) has a bug that it rejects globexthdr.mtime that # contains fraction of seconds. pax_options=$(printf '%s%s%s%s%s%s' \ "globexthdr.name=pax_global_header," \ "globexthdr.mtime={$(echo $|sed -e 's/\.[0-9]*Z/Z/g')}," \ "comment=$," \ "exthdr.name=%d/PaxHeaders/%f," \ "delete=atime," \ "delete=ctime") find "$dist_name" \ \( -type d -exec printf '%s/\n' '{}' \; \) -o -print | LC_ALL=C sort | tar -c --no-recursion --format=pax --owner=root:0 --group=root:0 \ --pax-option="$pax_options" -f "$.tar" -T -  # Compression (gzip/xz) can add additional non-deterministic factors. # xz format does not store file name or timestamp... trap 's=$?; rm -f "$.tar.xz" || : ; exit $s' 1 2 3 15 xz -9e -k "$.tar"  # ...but for gzip, you need either --no-name option or feed the input # from stdin. This example uses former, and also tries advdef to # optimize compression if available. trap 's=$?; rm -f "$.tar.gz" || : ; exit $s' 1 2 3 15 gzip --no-name -9 -k "$.tar" && { advdef -4 -z "$.tar.gz" || : ; } 

Похожие вопросы