SVN direkt zu tar

13

Gibt es eine Möglichkeit, die neueste Version eines SVN-Ordners ohne die versteckten SVN-Dateien direkt zu tarieren? Ich möchte ein tar-Archiv ohne die SVN-Dateien erstellen. Ich weiß, dass Sie die neuesten SVN-Tracking-Dateien erhalten können, aber gibt es einen Einzeiler, der die Informationen direkt an ein Archiv sendet?

mönchisch
quelle
Ich weiß nicht, was svn angeht, aber mit github können Sie .tar.gzs eines Git-Repos herunterladen.
Macha

Antworten:

11

Der einfachste Weg, eine Kopie der neuesten Version eines Repositorys ohne alle .svn-Ordner zu erstellen, ist die Verwendung des svn exportBefehls.

So würde ich das Archiv erstellen:

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

Dabei ist URL die URL Ihres SVN-Repositorys und PATH ein lokaler Pfad, der zum Speichern einer Kopie des exportierten Repositorys geeignet ist. Ich weiß nicht, wie ich es direkter machen könnte. Leider bleibt die exportierte Kopie hängen, sodass Sie das Ganze möglicherweise in ein kurzes Bash-Skript einfügen möchten, das die temporären Dateien anschließend löscht.

BEARBEITEN: Während dies die einfachste Methode ist und das ist, was ich auch verwendet habe, wäre ich vorsichtig. Bei meiner Recherche habe ich festgestellt, dass http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn das Problem der Beibehaltung der Gruppen- / Benutzerbesitzverhältnisse deutlich macht, das Probleme bei der Bereitstellung auf einem anderen Computer verursacht System. Ich habe dieses Skript mit eigenen Modifikationen ausprobiert, um meinem Zweck zu entsprechen, und Sie könnten auch davon profitieren.

nedned
quelle
10

Möglicherweise können Sie mit der Version 1.23 von tar alle Versionsdateien von der Befehlszeile ausschließen, aber meine Version 1.20 funktioniert leider nicht:

tar --exclude-vcs -cvzf archive.tar.gz directory/
Deverne
quelle
Sehr schön! Ich wusste nichts über diese Option .
Peter Murray
4

Wechseln Sie in das Subversion-Arbeitsverzeichnis (Checkout) und führen Sie Folgendes aus:

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

Wenn Sie GNU-Dienstprogramme verwenden, können Sie auch Folgendes ausführen:

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

Nach Möglichkeit würde ich die Verwendung des Formats ustar ( -H ustar) empfehlen .

Cristian Ciupitu
quelle
3

Ich sehe auch:

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

Danke Teer.

Deverne
quelle
2

Wenn ich das richtig verstehe, möchten Sie die Ergebnisse einer SVN-Prüfung tarieren?

Im Pseudocode würde es also ungefähr so ​​aussehen:

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

Dies ist einem Einzeiler nachempfunden, den ich geschrieben habe. Es wird davon ausgegangen, dass Sie ein ~ / tmp-Verzeichnis haben. In den ersten beiden Schritten müssen Sie die Variablen PROJ und URL ändern. Der Rest sollte funktionieren.

Zum einfachen Kopieren:

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

Zur einfachen Anzeige:

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
quelle
0

Dies ist meine Bemühung, aus einem SVN-Repo einen deterministischen Tarball zu erstellen.

Benötigt GNU tar 1.27 oder neuer.

Eigenschaften:

  • Deterministischer Tarball
  • Zeitstempelgenauigkeit in Mikrosekunden von SVN dank paxerweitertem Header
  • In Archivkommentaren gespeicherte Revisions-ID wie git archivegewohnt
  • Ich demonstriere beides .tar.gzund .tar.xzKompressionen. Für gzip können Sie die Komprimierung mithilfe advdefvon AdvanceCOMP ( advdefverwendet die zopfli-Bibliothek) weiter optimieren .

Als Beispiel verwende ich Subversion Repo selbst als Quelle für das Auschecken und Erstellen des Tarballs. Beachten Sie, dass dies nicht die Art und Weise ist, wie SVN seine Tarballs paket, und ich bin in keiner Weise mit der SVN-Entwicklung verwandt. Es ist schließlich nur ein Beispiel .

# 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
quelle