SVN direkt zum tar

13906
monksy

Gibt es eine Möglichkeit, die neueste Version eines SVN-Ordners direkt zu tarieren, ohne die SVN-Dateien zu verstecken? 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 Liner, der die Informationen direkt an ein Archiv sendet?

14
Ich weiß nichts über svn, aber mit github können Sie .tar.gzs eines Git-Repos herunterladen. Macha vor 14 Jahren 0

7 Antworten auf die Frage

12
nedned

Die einfachste Möglichkeit, 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 kenne keinen Weg, dies direkter zu tun. Unglücklicherweise landen Sie mit der exportierten Kopie herum, so dass Sie das Ganze einfach in ein kurzes Bash-Skript einfügen möchten, das dann die temporären Dateien löscht.

BEARBEITEN: Obwohl dies die einfachste Methode ist und ich auch verwendet habe, wäre ich vorsichtig. Bei meiner Recherche habe ich folgendes gefunden: http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn, das uns eindeutig das Problem der konservierten Gruppen- / Benutzerbesitzung zeigt, das Probleme bei der Bereitstellung auf einem anderen verursacht System. Ich habe dieses Skript mit eigenen Modifikationen ausprobiert, die meinem Zweck entsprechen, und Sie könnten auch davon profitieren.

11
Deverne

Möglicherweise können Sie mit Version 1.23 von tar alle Versionierungsdateien von der Befehlszeile ausschließen, funktionieren aber leider nicht mit meiner Version 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/ 
Sehr schön! Ich wusste nichts über diese Option (http://www.gnu.org/software/tar/manual/html_section/exclude.html#IDX406). Peter Murray vor 13 Jahren 0
4
Cristian Ciupitu

Gehen 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 

Wenn möglich, würde ich empfehlen, das ustar- Format ( -H ustar) zu verwenden.

3
Deverne

Ich sehe auch:

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

Danke teer

2
warren

Wenn ich es richtig verstehe, wollen Sie die Ergebnisse einer SVN-Kasse tarieren?

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

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

Dies ist von einem Einzeiler, den ich geschrieben habe, angepasst. Es wird davon ausgegangen, dass Sie ein ~ / tmp-Verzeichnis haben. In den ersten beiden Schritten müssen Sie die PROJ- und URL-Variablen ä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 Betrachtung:

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
Explorer09

Dies ist mein Versuch, aus einem SVN-Repo ein deterministisches Archiv zu erstellen.

Benötigt GNU tar 1.27 oder höher.

Eigenschaften:

  • Deterministischer Tarball
  • Zeitstempelpräzision in Mikrosekunden von SVN dank paxerweitertem Header
  • Die in Archivkommentaren gespeicherte Revisions-ID ist genau wie git archivees tun würde
  • 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, in der SVN ihre Tarballs paketiert, und ich habe keinerlei Bezug zur SVN-Entwicklung. 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="\\([^">]*\)"\>.*|\1|') tar_name=$-r$ # 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" || : ; 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 $|sed -e 's/\.[0-9]*Z/Z/g')}," \ "comment=$," \ "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" -T -  # Compression (gzip/xz) can add additional non-deterministic factors. # xz format does not store file name or timestamp... trap 's=$?; rm -f "$.tar.xz" || : ; exit $s' 1 2 3 15 xz -9e -k "$.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.gz" || : ; exit $s' 1 2 3 15 gzip --no-name -9 -k "$.tar" && { advdef -4 -z "$.tar.gz" || : ; }