SVN direttamente su tar


13

C'è un modo per tarare direttamente l'ultima versione di una cartella SVN senza i file nascosti SVN? Vorrei creare un archivio tar senza i file SVN. So che puoi ottenere le ultime novità con i file di tracciamento SVN, ma esiste un solo liner che invierà direttamente le informazioni a un archivio?


Non so di svn, ma github ti permette di scaricare .tar.gzs di un repository git.
Macha,

Risposte:


11

Il modo più semplice per fare una copia dell'ultima versione di un repository senza tutte le cartelle .svn è usare il svn exportcomando.

Ecco come farei l'archivio:

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

Dove URL è l'URL del repository svn e PATH è un percorso locale adatto per il salvataggio di una copia del repository esportato. Non conosco un modo per farlo più direttamente di così. Sfortunatamente finisci con la copia esportata in giro, quindi potresti voler semplicemente mettere tutto in un breve script bash che poi cancella i file temporanei.

EDIT: Anche se questo è il metodo più semplice ed è quello che ho usato anche io starei attento. Nella mia ricerca ho trovato questo http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn che ci dice chiaramente il problema della conservazione della proprietà di gruppo / utente che causa problemi durante la distribuzione su un altro sistema. Ho provato questo script con modifiche mie per soddisfare il mio scopo e potresti trarne beneficio.


10

Forse la versione 1.23 di tar ti consente di escludere tutti i file di versioning dalla riga di comando ma sfortunatamente non funziona sulla mia versione 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/

Molto bella! Non sapevo di quell'opzione .
Peter Murray,

4

Vai alla directory di lavoro di sovversione (checkout) ed esegui questo:

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

Se stai usando le utility GNU puoi anche eseguire:

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

Se possibile, consiglierei di usare il formato ustar ( -H ustar).


3

Vedo anche:

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

Grazie tar.


2

Se ho capito bene, vuoi tar i risultati di un checkout svn?

Quindi, in pseudocodice, sarebbe simile a questo:

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

0

Questo è adattato da una riga che ho scritto. Presuppone che tu abbia una directory ~ / tmp. Dovrai modificare le variabili PROJ e URL nei primi due passaggi. Il resto dovrebbe funzionare.

Per una facile copia:

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

Per una facile visualizzazione:

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

Questo è il mio sforzo di provare a creare un tarball deterministico da un repository SVN.

Richiede tar GNU 1.27 o successivo.

Caratteristiche:

  • Tarball deterministico
  • Precisione del timestamp in microsecondi da SVN, grazie all'intestazione paxestesa
  • ID di revisione memorizzato nei commenti di archivio proprio come git archivefarebbe
  • Dimostro sia .tar.gze .tar.xzcompressioni. Per gzip, puoi ottimizzare ulteriormente la compressione usando advdefda AdvanceCOMP ( advdefusa la libreria zopfli).

Ad esempio, utilizzo il repository Subversion stesso come fonte per il checkout e la creazione del tarball. Nota che questo non è il modo in cui SVN impacchetta i loro tarball e non sono in alcun modo correlato allo sviluppo di SVN. È solo un esempio , dopo tutto.

# 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" || : ; }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.