SVN langsung ke tar


13

Apakah ada cara untuk secara langsung tar versi terbaru dari folder SVN tanpa file tersembunyi SVN? Saya ingin membuat arsip tar tanpa file SVN. Saya tahu Anda bisa mendapatkan yang terbaru dengan file pelacakan SVN, tetapi apakah ada satu liner yang akan langsung mengirim informasi ke arsip?


Saya tidak tahu tentang svn, tetapi github memungkinkan Anda untuk mengunduh .tar.gzs dari repo git.
Macha

Jawaban:


11

Cara termudah untuk membuat salinan versi terbaru dari repositori tanpa semua folder .svn adalah dengan menggunakan svn exportperintah.

Inilah cara saya membuat arsip:

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

Di mana URL adalah URL repositori svn Anda dan PATH adalah jalur lokal yang cocok untuk menyimpan salinan repositori yang diekspor. Saya tidak tahu cara melakukannya lebih langsung dari ini. Sayangnya Anda berakhir dengan salinan yang diekspor berkeliaran, jadi Anda mungkin hanya ingin meletakkan semuanya dalam skrip bash pendek yang kemudian menghapus file temp sesudahnya.

EDIT: Meskipun ini adalah metode termudah dan apa yang saya gunakan juga saya akan berhati-hati. Dalam penelitian saya, saya menemukan ini http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn yang dengan jelas memberi tahu kita masalah kepemilikan grup / pengguna yang terpelihara yang menyebabkan masalah ketika digunakan ke yang lain sistem. Saya telah mencoba skrip ini dengan modifikasi saya sendiri sesuai dengan tujuan saya dan Anda mungkin mendapat manfaat juga.


10

Mungkin tar versi 1.23 memungkinkan Anda untuk mengecualikan semua file versi dari baris perintah tetapi sayangnya tidak berfungsi pada versi 1.20 saya:

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

Sangat bagus! Saya tidak tahu tentang opsi itu .
Peter Murray

4

Buka direktori kerja subversi (checkout) dan jalankan ini:

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

Jika Anda menggunakan utilitas GNU, Anda juga dapat menjalankan:

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

Jika memungkinkan, saya akan merekomendasikan menggunakan format ustar ( -H ustar).


3

Saya juga melihat:

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

Terima kasih tar.


2

Jika saya mengerti dengan benar, Anda ingin mendapatkan hasil checkout svn?

Jadi, dalam pseudocode, akan terlihat seperti ini:

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

0

Ini diadaptasi dari one-liner yang saya tulis. Diasumsikan Anda memiliki direktori ~ / tmp. Anda harus mengubah variabel PROJ dan URL dalam dua langkah pertama. Sisanya harus bekerja.

Untuk menyalin mudah:

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

Agar mudah dilihat:

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

Ini adalah usaha saya untuk mencoba membuat tarball deterministik dari repo SVN.

Membutuhkan GNU tar 1.27 atau lebih baru.

Fitur:

  • Tarbal deterministik
  • Timestamp presisi dalam mikrodetik dari SVN, berkat paxheader yang diperpanjang
  • ID revisi disimpan dalam komentar arsip seperti yang git archiveakan dilakukan
  • Saya menunjukkan keduanya .tar.gzdan .tar.xzkompresi. Untuk gzip, Anda dapat mengoptimalkan kompresi lebih lanjut dengan menggunakan advdefdari AdvanceCOMP ( advdefmenggunakan perpustakaan zopfli).

Sebagai contoh, saya menggunakan repo subversi sendiri sebagai sumber untuk checkout dan pembuatan tarball. Perhatikan bahwa ini bukan cara SVN mengemas tarbal mereka dan saya tidak terkait dengan pengembangan SVN. Lagipula itu hanya contoh .

# 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" || : ; }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.