SVN directamente al alquitrán

13

¿Hay alguna manera de tar directamente la última versión de una carpeta SVN sin los archivos ocultos SVN? Me gustaría crear un archivo tar sin los archivos SVN. Sé que puede obtener lo último con los archivos de seguimiento de SVN, pero ¿hay un revestimiento que envíe directamente la información a un archivo?

monjes
fuente
No sé acerca de svn, pero github le permite descargar .tar.gzs de un repositorio de git.
Macha

Respuestas:

11

La forma más fácil de hacer una copia de la última versión de un repositorio sin todas las carpetas .svn es usar el svn exportcomando.

Así es como haría el archivo:

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

Donde URL es la URL de su repositorio svn y PATH es una ruta local adecuada para guardar una copia del repositorio exportado. No sé una forma de hacerlo más directamente que esto. Desafortunadamente, terminas con la copia exportada dando vueltas, por lo que es posible que solo quieras poner todo en un breve script bash que luego elimina los archivos temporales después.

EDITAR: Si bien este es el método más fácil y es el que usé también, sería cuidadoso. En mi investigación encontré este http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn que claramente nos dice el problema de la propiedad del grupo / usuario preservado que causa problemas cuando se implementa en otro sistema. He intentado este script con modificaciones propias para adaptarme a mi propósito y usted también podría beneficiarse.

nedned
fuente
10

Tal vez la versión 1.23 de tar le permite excluir todos los archivos de versiones de la línea de comandos, pero desafortunadamente no funciona en mi versión 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/
Deverne
fuente
¡Muy agradable! No sabía sobre esa opción .
Peter Murray
4

Vaya al directorio de trabajo de subversion (pago) y ejecute esto:

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

Si está utilizando utilidades GNU, también puede ejecutar:

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

Si es posible, recomendaría usar el formato ustar ( -H ustar).

Cristian Ciupitu
fuente
3

Yo también veo:

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

Gracias alquitrán.

Deverne
fuente
2

Si lo entiendo correctamente, ¿quieres tar los resultados de un pago de svn?

Entonces, en pseudocódigo, se vería así:

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

Esto está adaptado de una frase que escribí. Se supone que tiene un directorio ~ / tmp. Deberá cambiar las variables PROJ y URL en los primeros dos pasos. El resto debería funcionar.

Para copiar fácilmente:

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

Para una fácil visualización:

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
np trivial
fuente
0

Este es mi esfuerzo de tratar de hacer un tarball determinista a partir de un repositorio SVN.

Requiere GNU tar 1.27 o posterior.

caracteristicas:

  • Tarball determinista
  • Precisión de marca de tiempo en microsegundos de SVN, gracias al paxencabezado extendido
  • La ID de revisión almacenada en los comentarios del archivo tal como git archivelo haría
  • Demuestro ambos .tar.gzy .tar.xzcompresiones. Para gzip, es posible optimizar la compresión adicional mediante el uso advdefde AdvanceCOMP ( advdefusos zopfli biblioteca).

Como ejemplo, utilizo el repositorio de subversión como fuente para el pago y la creación del tarball. Tenga en cuenta que esta no es la forma en que SVN empaqueta sus tarballs y no estoy relacionado con el desarrollo de SVN. Es solo un ejemplo , después de todo.

# 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" || : ; }
Explorer09
fuente