SVN directement à tar

14

Existe-t-il un moyen de tarer directement la dernière version d'un dossier SVN sans les fichiers cachés SVN? Je voudrais créer une archive tar sans les fichiers SVN. Je sais que vous pouvez obtenir le dernier en date avec les fichiers de suivi SVN, mais existe-t-il une seule ligne qui enverra directement les informations à une archive?

moine
la source
Je ne sais pas à propos de svn, mais github vous permet de télécharger .tar.gzs d'un dépôt Git.
Macha

Réponses:

12

Le moyen le plus simple de créer une copie de la dernière version d'un référentiel sans tous les dossiers .svn consiste à utiliser la svn exportcommande.

Voici comment je ferais les archives:

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

Où URL est l'URL de votre référentiel svn et PATH est un chemin local approprié pour enregistrer une copie du référentiel exporté. Je ne sais pas comment le faire plus directement. Malheureusement, vous vous retrouvez avec la copie exportée, alors vous voudrez peut-être tout mettre dans un court script bash qui supprimera ensuite les fichiers temporaires.

EDIT: Bien que ce soit la méthode la plus simple et que je l’utilise aussi, je ferais attention. Dans mes recherches, j'ai trouvé ce http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn qui nous indique clairement le problème de la propriété de groupe / utilisateur préservée qui pose des problèmes lors du déploiement sur un autre système. J'ai essayé ce script avec des modifications personnelles en fonction de mes objectifs et vous pourriez également en bénéficier.

nedned
la source
11

Peut-être que la version 1.23 de tar vous permet d'exclure tous les fichiers de versioning de la ligne de commande mais ne fonctionne malheureusement pas avec ma version 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/
Deverne
la source
Très agréable! Je ne connaissais pas cette option .
Peter Murray
4

Allez dans le répertoire de travail de subversion (checkout) et lancez ceci:

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

Si vous utilisez des utilitaires GNU, vous pouvez également exécuter:

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

Si possible, je recommanderais d'utiliser le format ustar ( -H ustar).

Cristian Ciupitu
la source
3

Je vois aussi:

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

Merci tar.

Deverne
la source
2

Si je comprends bien, vous souhaitez tarir les résultats d'une commande svn?

Donc, en pseudo-code, cela ressemblerait à ceci:

svn export branch; find branch | grep -v '/.' | xargs cp tarbranch ; tar -zcf tarbranch.tgz tarbranch
garenne
la source
0

Ceci est adapté d'un one-line que j'ai écrit. Cela suppose que vous avez un répertoire ~ / tmp. Vous devrez modifier les variables PROJ et URL dans les deux premières étapes. Le reste devrait marcher.

Pour une copie facile:

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

Pour une visualisation facile:

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
la source
0

Il s’agit pour moi d’essayer de créer une archive déterministe à partir d’un dépôt SVN.

Nécessite GNU tar 1.27 ou une version ultérieure.

Fonctionnalités:

  • Tarball déterministe
  • Précision d'horodatage en microsecondes de SVN, grâce à l'en pax-tête étendu
  • ID de révision stocké dans les commentaires d'archive, comme il le git archiveferait
  • Je démontre les deux .tar.gzet .tar.xzcompressions. Pour gzip, vous pouvez optimiser davantage la compression en utilisant à advdefpartir de AdvanceCOMP ( advdefutilise la bibliothèque zopfli).

Par exemple, j'utilise subversion repo lui-même comme source pour le contrôle et la création de l'archive. Notez que ce n'est pas comme ça que SVN empaquete leurs archives et que je ne suis pas du tout lié au développement de SVN. Ce n'est qu'un exemple , après tout.

# 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
la source