SVN trực tiếp đến tar


13

Có cách nào để trực tiếp tar phiên bản mới nhất của thư mục SVN mà không có các tệp ẩn SVN không? Tôi muốn tạo một kho lưu trữ tar mà không cần các tệp SVN. Tôi biết bạn có thể nhận bản mới nhất với các tệp theo dõi SVN, nhưng có một lớp lót nào sẽ trực tiếp gửi thông tin đến kho lưu trữ không?


Tôi không biết về svn, nhưng github cho phép bạn tải xuống .tar.gzs của một repo git.
Macha

Câu trả lời:


11

Cách dễ nhất để tạo một bản sao của phiên bản mới nhất của kho lưu trữ mà không cần tất cả các thư mục .svn là sử dụng svn exportlệnh.

Đây là cách tôi sẽ thực hiện việc lưu trữ:

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

Trong đó URL là URL của kho svn của bạn và PATH là đường dẫn cục bộ phù hợp để lưu một bản sao của kho lưu trữ đã xuất. Tôi không biết một cách để làm điều đó trực tiếp hơn thế này. Thật không may, bạn kết thúc với bản sao xuất khẩu treo xung quanh, vì vậy bạn có thể chỉ muốn đặt toàn bộ trong một tập lệnh bash ngắn sau đó xóa các tệp tạm thời sau đó.

EDIT: Mặc dù đây là phương pháp dễ nhất và cũng là những gì tôi đã sử dụng nên tôi sẽ cẩn thận. Trong nghiên cứu của tôi, tôi đã tìm thấy http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn cho chúng tôi biết rõ vấn đề về quyền sở hữu nhóm / người dùng được bảo tồn gây ra vấn đề khi triển khai cho người khác hệ thống. Tôi đã thử kịch bản này với các sửa đổi của riêng tôi để phù hợp với mục đích của tôi và bạn cũng có thể có lợi.


10

Có thể phiên bản 1.23 của tar cho phép bạn loại trừ tất cả các tệp phiên bản khỏi dòng lệnh nhưng không may không hoạt động trên phiên bản 1.20 của tôi:

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

Rất đẹp! Tôi không biết về lựa chọn đó .
Peter Murray

4

Chuyển đến thư mục làm việc lật đổ (thanh toán) và chạy này:

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

Nếu bạn đang sử dụng các tiện ích GNU, bạn cũng có thể chạy:

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

Nếu có thể, tôi khuyên bạn nên sử dụng định dạng ustar ( -H ustar).


3

Tôi cũng thấy như vậy:

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

Cảm ơn tar.


2

Nếu tôi hiểu chính xác, bạn có muốn tar kết quả kiểm tra svn không?

Vì vậy, trong mã giả, nó sẽ trông giống như thế này:

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

0

Điều này được điều chỉnh từ một lớp lót tôi đã viết. Nó giả sử bạn có một thư mục ~ / tmp. Bạn sẽ cần thay đổi các biến PROJ và URL trong hai bước đầu tiên. Phần còn lại nên làm việc.

Để sao chép dễ dàng:

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

Để xem dễ dàng:

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

Đây là nỗ lực của tôi trong việc cố gắng tạo ra một tarball xác định từ một repo SVN.

Yêu cầu GNU tar 1.27 trở lên.

Đặc trưng:

  • Tarball quyết đoán
  • Độ chính xác của dấu thời gian tính bằng micrô giây từ SVN, nhờ paxtiêu đề mở rộng
  • ID sửa đổi được lưu trữ trong các bình luận lưu trữ giống như git archivesẽ làm
  • Tôi chứng minh cả hai .tar.gz.tar.xznén. Đối với gzip, bạn có thể tối ưu hóa việc nén hơn nữa bằng cách sử dụng advdeftừ AdvanceCOMP ( advdefsử dụng thư viện zopfli).

Ví dụ, tôi sử dụng repo subversion như một nguồn để kiểm tra và tạo tarball. Lưu ý rằng đây không phải là cách SVN gói tarball của họ và tôi không có cách nào liên quan đến phát triển SVN. Rốt cuộc, đây chỉ là một ví dụ .

# 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" || : ; }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.