Есть ли способ напрямую смонтировать последнюю версию папки SVN без скрытых файлов SVN? Я хотел бы создать архив tar без файлов SVN. Я знаю, что вы можете получить последнюю версию с файлами отслеживания SVN, но есть ли один лайнер, который будет напрямую отправлять информацию в архив?
7 ответов
Самый простой способ сделать копию последней версии репозитория без всех папок .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, который ясно говорит нам о проблеме сохранения групповой / пользовательской собственности, которая вызывает проблемы при развертывании на другой система. Я пробовал этот сценарий с моими модификациями, чтобы соответствовать моим целям, и вы могли бы также извлечь выгоду
Возможно, версия 1.23 tar позволяет исключить все файлы версий из командной строки, но, к сожалению, не работает на моей версии 1.20:
tar --exclude-vcs -cvzf archive.tar.gz directory/
Перейдите в рабочий каталог 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
).
Я также вижу:
tar cvfz archive.tar.gz directory/ --exclude='*/.svn'
Спасибо, смола.
Если я правильно понимаю, вы хотите оценить результаты проверки svn?
Итак, в псевдокоде это будет выглядеть примерно так:
svn export branch; find branch | grep -v '/.' | xargs cp tarbranch ; tar -zcf tarbranch.tgz tarbranch
Это моя попытка сделать детерминированный тарбол из репозитория SVN.
Требуется GNU tar 1.27 или более поздняя версия.
Особенности:
- Детерминированный тарбол
- Точность отметки времени в микросекундах из SVN благодаря расширенному заголовку
pax
- Идентификатор ревизии, хранящийся в комментариях архива, так же, как это делал бы
git archive
- Я демонстрирую оба сжатия
.tar.gz
и.tar.xz
. Для Gzip, вы можете оптимизировать сжатие дальше, используяadvdef
из AdvanceCOMPadvdef
использует zopfli библиотеку).
В качестве примера я использую сам репозиторий Subversion в качестве источника для проверки и создания архива. Обратите внимание, что это не тот способ, которым SVN упаковывает свои архивы, и я никак не связан с разработкой 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="\{0,1\}\([^">]*\)"\{0,1\}>.*|\1|')
tar_name=${dist_name}-r${revision}
# 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_name}.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 ${date}|sed -e 's/\.[0-9]*Z/Z/g')}," \
"comment=${revision}," \
"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_name}.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_name}.tar.xz" || : ; exit $s' 1 2 3 15
xz -9e -k "${tar_name}.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_name}.tar.gz" || : ; exit $s' 1 2 3 15
gzip --no-name -9 -k "${tar_name}.tar" &&
{ advdef -4 -z "${tar_name}.tar.gz" || : ; }
Это адаптировано из одной строки, которую я написал. Предполагается, что у вас есть каталог ~/tmp. Вам нужно будет изменить переменные PROJ и URL на первых двух шагах. Остальное должно работать.
Для легкого копирования:
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
Для удобства просмотра:
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