SVN 직접 tar


13

SVN 숨김 파일없이 최신 버전의 SVN 폴더를 직접 tar하는 방법이 있습니까? SVN 파일없이 tar 아카이브를 만들고 싶습니다. SVN 추적 파일을 사용하여 최신 정보를 얻을 수 있지만 정보를 아카이브로 직접 보내는 라이너가 하나 있습니까?


svn에 대해서는 모르지만 github을 사용하면 git repo의 .tar.gzs를 다운로드 할 수 있습니다.
Macha

답변:


11

모든 .svn 폴더없이 최신 버전의 리포지토리 복사본을 만드는 가장 쉬운 방법은 svn export명령 을 사용하는 것 입니다.

아카이브를 만드는 방법은 다음과 같습니다.

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

여기서 URL은 svn 저장소의 URL이고 PATH는 내 보낸 저장소의 사본을 저장하기에 적합한 로컬 경로입니다. 나는 이것보다 직접적으로 할 수있는 방법을 모른다. 불행히도 내 보낸 사본이 매달려 있기 때문에 모든 것을 짧은 bash 스크립트에 넣고 나중에 임시 파일을 삭제하려고 할 수 있습니다.

편집 : 이것은 가장 쉬운 방법이지만 내가 사용한 것이기도하지만 조심해야합니다. 내 연구 에서이 http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn 을 발견 했습니다. 다른 그룹에 배포 할 때 문제를 일으키는 보존 된 그룹 / 사용자 소유권의 문제를 분명히 알려줍니다. 체계. 내 목적에 맞게 내 스크립트를 수정하여이 스크립트를 사용해 보았을 때 도움이 될 수도 있습니다.


10

어쩌면 tar 버전 1.23을 사용하면 모든 버전 관리 파일을 명령 줄에서 제외 할 수 있지만 불행히도 1.20 버전에서는 작동하지 않습니다.

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

아주 좋아요! 나는 그 옵션 에 대해 몰랐다 .
피터 머레이

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)을 사용하는 것이 좋습니다 .


3

나도 본다 :

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

고마워 타르


2

내가 올바르게 이해한다면 svn 체크 아웃의 결과를 tar하고 싶습니까?

따라서 의사 코드에서는 다음과 같이 보입니다.

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

이것은 SVN 저장소에서 결정적인 타르볼을 만들려는 노력입니다.

GNU tar 1.27 이상이 필요합니다.

풍모:

  • 결정적인 타르볼
  • pax확장 된 헤더 덕분에 SVN에서 마이크로 초 단위의 타임 스탬프 정밀도
  • 처럼 아카이브 의견에 저장 개정 ID는 git archive할 것
  • 압축 .tar.gz.tar.xz압축을 모두 보여줍니다 . gzip의 경우 AdvanceCOMP ( zopfli 라이브러리 사용) advdef에서 압축을 더욱 최적화 할 수 있습니다 .advdef

예를 들어, 나는 타르볼을 체크 아웃하고 생성하기위한 소스로 서브 버전 저장소를 사용합니다. 이것은 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.