SVN โดยตรงไปยัง tar


13

มีวิธีในการ tar เวอร์ชันล่าสุดของโฟลเดอร์ SVN โดยตรงโดยไม่ต้องซ่อนไฟล์ SVN หรือไม่? ฉันต้องการสร้างไฟล์เก็บถาวร tar โดยไม่มีไฟล์ SVN ฉันรู้ว่าคุณสามารถรับไฟล์ล่าสุดในการติดตาม SVN แต่มีซับไลน์เดียวที่จะส่งข้อมูลไปยังไฟล์เก็บถาวรโดยตรงหรือไม่


ฉันไม่รู้เกี่ยวกับ svn แต่ github อนุญาตให้คุณดาวน์โหลด. tar.gzs ของ repo git
มัจฉา

คำตอบ:


11

วิธีที่ง่ายที่สุดในการทำสำเนาของที่เก็บเวอร์ชันล่าสุดโดยไม่มีโฟลเดอร์. svn ทั้งหมดคือการใช้svn exportคำสั่ง

นี่คือวิธีที่ฉันจะทำให้การเก็บถาวร:

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

โดยที่ URL คือ URL ของที่เก็บ svn ของคุณและ PATH เป็นเส้นทางภายในที่เหมาะสมสำหรับการบันทึกสำเนาของที่เก็บที่ถูกส่งออก ฉันไม่รู้วิธีที่จะทำมากกว่านี้โดยตรง น่าเสียดายที่คุณจบลงด้วยการคัดลอกส่งออกที่แขวนอยู่รอบ ๆ ดังนั้นคุณอาจต้องการใส่ข้อมูลทั้งหมดลงในสคริปต์ทุบตีสั้น ๆ ซึ่งจะลบไฟล์ชั่วคราวหลังจากนั้น

แก้ไข: ในขณะนี้เป็นวิธีที่ง่ายที่สุดและเป็นสิ่งที่ฉันใช้เช่นกันฉันจะระวัง ในการวิจัยของฉันฉันพบ http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn ซึ่งบอกปัญหาของกลุ่มเจ้าของ / ผู้ใช้ที่เก็บรักษาไว้อย่างชัดเจนซึ่งทำให้เกิดปัญหาเมื่อนำไปใช้กับผู้อื่น ระบบ. ฉันได้ลองใช้สคริปต์นี้พร้อมกับการดัดแปลงของฉันเองเพื่อให้เหมาะกับวัตถุประสงค์ของฉันและคุณอาจได้รับประโยชน์เช่นกัน


10

อาจเป็นรุ่น 1.23 ของ tar ช่วยให้คุณสามารถยกเว้นไฟล์เวอร์ชันทั้งหมดจากบรรทัดคำสั่ง แต่น่าเสียดายที่ใช้ไม่ได้กับเวอร์ชั่น 1.20 ของฉัน:

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

ดีมาก! ฉันไม่รู้เกี่ยวกับตัวเลือกนั้น
Peter Murray

4

ไปที่ไดเรกทอรีการทำงานการโค่นล้ม (ชำระเงิน) และเรียกใช้สิ่งนี้:

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

หากคุณใช้ยูทิลิตี้ GNU คุณสามารถเรียกใช้:

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

หากเป็นไปได้ฉันขอแนะนำให้ใช้รูปแบบustar ( -H ustar)



2

หากฉันเข้าใจอย่างถูกต้องคุณต้องการส่งผลการชำระเงิน svn หรือไม่

ดังนั้นใน pseudocode มันจะออกมาเป็นแบบนี้:

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

0

สิ่งนี้ดัดแปลงมาจากสายการบินเดียวที่ฉันเขียน ถือว่าคุณมีไดเรกทอรี ~ / tmp คุณจะต้องเปลี่ยนตัวแปร PROJ และ URL ในสองขั้นตอนแรก ที่เหลือควรทำงาน

สำหรับการคัดลอกง่าย:

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

สำหรับการดูง่าย:

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

นี่คือความพยายามของฉันในการพยายามสร้าง tarball ที่กำหนดขึ้นมาจาก repo SVN

ต้องใช้ GNU tar 1.27 หรือใหม่กว่า

คุณสมบัติ:

  • tarball กำหนด
  • ความแม่นยำของการประทับเวลาเป็นไมโครวินาทีจาก SVN ขอบคุณpaxส่วนหัวที่ขยาย
  • Revision ID ที่เก็บไว้ในความคิดเห็นที่เก็บถาวรเช่นเดียวกับที่git archiveทำ
  • ฉันสาธิตทั้งสอง.tar.gzและการ.tar.xzบีบอัด สำหรับ gzip คุณสามารถเพิ่มประสิทธิภาพการบีบอัดเพิ่มเติมโดยใช้advdefจากAdvanceCOMP ( advdefใช้ไลบรารี zopfli)

ตัวอย่างเช่นฉันใช้ repo การโค่นล้มเป็นแหล่งสำหรับเช็คเอาต์และการสร้าง tarball โปรดทราบว่านี่ไม่ใช่วิธีที่ SVN จัดทำ tarball ของพวกเขาและฉันไม่มีทางเกี่ยวข้องกับการพัฒนา SVN มันเป็นเพียงตัวอย่างหลังจากทั้งหมด

# 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" || : ; }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.