SVN bezpośrednio do tar

14

Czy istnieje sposób bezpośredniego tarowania najnowszej wersji folderu SVN bez ukrytych plików SVN? Chciałbym utworzyć archiwum tar bez plików SVN. Wiem, że możesz uzyskać najnowsze dzięki plikom śledzenia SVN, ale czy istnieje jedna linijka, która bezpośrednio wyśle ​​informacje do archiwum?

mnich
źródło
Nie wiem o svn, ale github pozwala ci pobrać .tar.gzs z repozytorium git.
Macha

Odpowiedzi:

12

Najprostszym sposobem na utworzenie kopii najnowszej wersji repozytorium bez wszystkich folderów .svn jest użycie svn exportpolecenia.

Oto jak utworzę archiwum:

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

Gdzie URL jest adresem URL twojego repozytorium svn, a PATH jest ścieżką lokalną odpowiednią do zapisywania kopii eksportowanego repozytorium. Nie wiem, jak to zrobić bardziej bezpośrednio niż to. Niestety skończyło się na tym, że wyeksportowano kopię, więc możesz po prostu umieścić całość w krótkim skrypcie bash, który następnie usuwa pliki tymczasowe.

EDYCJA: Chociaż jest to najłatwiejsza metoda i tego też użyłem, byłbym ostrożny. W moich badaniach znalazłem ten http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn, który wyraźnie mówi nam problem zachowanej własności grupy / użytkownika, który powoduje problemy podczas wdrażania na innym system. Próbowałem tego skryptu z własnymi modyfikacjami, aby dopasować go do mojego celu, a Ty również możesz skorzystać.

Nedned
źródło
11

Może wersja 1.23 tar pozwala na wykluczenie wszystkich plików wersji z wiersza poleceń, ale niestety nie działa na mojej wersji 1.20:

tar --exclude-vcs -cvzf archive.tar.gz directory/
Deverne
źródło
Bardzo dobrze! Nie wiedziałem o tej opcji .
Peter Murray
4

Przejdź do katalogu roboczego subversion (kasa) i uruchom to:

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

Jeśli używasz narzędzi GNU, możesz także uruchomić:

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

Jeśli to możliwe, polecam użycie formatu ustar ( -H ustar).

Cristian Ciupitu
źródło
3

Widzę również:

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

Dzięki tar.

Deverne
źródło
2

Jeśli dobrze rozumiem, chcesz tarować wyniki transakcji svn?

W pseudokodzie wyglądałoby to mniej więcej tak:

svn export branch; find branch | grep -v '/.' | xargs cp tarbranch ; tar -zcf tarbranch.tgz tarbranch
królikarnia
źródło
0

Jest to dostosowane z jednego linijki, którą napisałem. Zakłada się, że masz katalog ~ / tmp. Musisz zmienić zmienne PROJ i URL w pierwszych dwóch krokach. Reszta powinna działać.

Dla łatwego kopiowania:

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

Dla łatwego przeglądania:

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
np trywialne
źródło
0

To jest mój wysiłek, aby spróbować deterministycznego archiwum z repozytorium SVN.

Wymaga GNU tar 1.27 lub nowszego.

Cechy:

  • Deterministyczne tarball
  • Precyzja znacznika czasu w mikrosekundach od SVN, dzięki paxrozszerzonemu nagłówkowi
  • Identyfikator wersji przechowywany w komentarzach archiwum, tak jak git archiveby to zrobił
  • Pokazuję oba .tar.gzi .tar.xzuciśnięcia. W przypadku gzip możesz dodatkowo zoptymalizować kompresję, korzystając advdefz AdvanceCOMP ( advdefużywa biblioteki zopfli).

Jako przykład używam samego repozytorium subversion jako źródła do kasy i tworzenia tarballa. Zauważ, że to nie jest sposób, w jaki SVN pakuje swoje archiwum i nie jestem w żaden sposób związany z rozwojem SVN. W końcu to tylko przykład .

# 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" || : ; }
Explorer09
źródło