SVN doğrudan katran


13

SVN gizli dosyaları olmadan bir SVN klasörünün en son sürümünü doğrudan tarlamanın bir yolu var mı? SVN dosyaları olmadan bir tar arşivi oluşturmak istiyorum. SVN izleme dosyalarıyla en son bilgileri alabileceğinizi biliyorum, ancak bilgileri doğrudan bir arşive gönderecek tek bir astar var mı?


Svn hakkında bilmiyorum, ancak github bir git repo'nun .tar.gzs dosyasını indirmenize izin veriyor.
Macha

Yanıtlar:


11

Tüm .svn klasörleri olmadan bir deponun en son sürümünün bir kopyasını oluşturmanın en kolay yolu svn exportkomutu kullanmaktır .

İşte arşivi nasıl yapacağım:

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

URL, svn deponuzun URL'si ve PATH, dışa aktarılan deponun bir kopyasını kaydetmek için uygun yerel bir yoldur. Bundan daha doğrudan yapmanın bir yolunu bilmiyorum. Maalesef dışa aktarılan kopyanın etrafında asılı kalmasıyla sonuçlanır, böylece her şeyi kısa bir bash betiğine koymak isteyebilirsiniz, daha sonra geçici dosyaları daha sonra siler.

EDIT: Bu en kolay yöntem olsa da ben de kullandım dikkatli olun. Araştırmamda, http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn adresini, başka bir kişiye dağıtılırken sorunlara neden olan korunmuş grup / kullanıcı sahipliği sorununu açıkça anlatan buldum. sistemi. Amacım için kendi modifikasyonları ile bu komut dosyasını denedim ve siz de faydalanabilirsiniz.


10

Belki tar 1.23 sürümü, tüm sürüm dosyalarını komut satırından hariç tutmanıza izin verir, ancak maalesef 1.20 sürümümde çalışmaz:

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

Çok hoş! Bu seçeneği bilmiyordum .
Peter Murray

4

Subversion çalışma dizinine (ödeme) gidin ve şunu çalıştırın:

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

GNU yardımcı programları kullanıyorsanız şunları da çalıştırabilirsiniz:

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

Mümkünse, ustar biçimini ( -H ustar) kullanmanızı öneririm .


3

Ben de görüyorum:

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

Teşekkürler tar.


2

Doğru anlıyorsam, bir svn kasasının sonuçlarını katlamak mı istiyorsunuz?

Yani, sözde kodda şöyle bir şey olurdu:

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

0

Bu, yazdığım tek bir astardan uyarlandı. Bir ~ / tmp dizininizin olduğunu varsayar. İlk iki adımda PROJ ve URL değişkenlerini değiştirmeniz gerekecektir. Gerisi işe yaramalı.

Kolay kopyalama için:

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

Kolay görüntüleme için:

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

Bu, bir SVN deposundan deterministik bir tarball yapmaya çalışmam.

GNU katran 1.27 veya üstünü gerektirir.

Özellikleri:

  • Deterministik tarball
  • paxGenişletilmiş başlık sayesinde SVN'den mikrosaniye cinsinden zaman damgası hassasiyeti
  • Tıpkı arşiv yorumlarla saklanan Revizyon Kimliği git archiveyapacağını
  • Her ikisini .tar.gzve .tar.xzkompresyonları gösteriyorum . Gzip için, kullanılarak daha ileri bir sıkıştırma optimize edebilir advdefgelen AdvanceCOMP ( advdefkullanımları zopfli kütüphanesi).

Örnek olarak, subballion repo'yu tarball'ın oluşturulması ve oluşturulması için bir kaynak olarak kullanıyorum. SVN'nin tarball'larını paketlemesinin bu yolu olmadığını ve SVN'nin gelişimi ile ilgili bir yol olmadığımı unutmayın. Sonuçta bu sadece bir örnek .

# 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" || : ; }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.