SVN diretamente para alcatrão


13

Existe uma maneira de tar diretamente a versão mais recente de uma pasta SVN sem os arquivos ocultos SVN? Eu gostaria de criar um arquivo tar sem os arquivos SVN. Sei que você pode obter as informações mais recentes com os arquivos de rastreamento SVN, mas existe um liner que enviará as informações diretamente para um arquivo?


Não sei sobre o svn, mas o github permite que você baixe .tar.gzs de um repositório git.
2111 Macha

Respostas:


11

A maneira mais fácil de fazer uma cópia da versão mais recente de um repositório sem todas as pastas .svn é usar o svn exportcomando

Aqui está como eu faria o arquivo:

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

Onde URL é a URL do seu repositório svn e PATH é um caminho local adequado para salvar uma cópia do repositório exportado. Não sei como fazê-lo mais diretamente do que isso. Infelizmente, você acaba com a cópia exportada, por isso pode querer colocar tudo em um pequeno script bash que, em seguida, exclui os arquivos temporários.

Edição: Embora este seja o método mais fácil e seja o que eu usei, seria cuidadoso. Em minha pesquisa, encontrei este http://narfation.org/2009/01/08/creating-recreatable-tar-gz-from-svn, que claramente nos diz o problema da propriedade preservada do grupo / usuário, que causa problemas ao implantar em outro sistema. Eu tentei esse script com modificações próprias para se adequar ao meu propósito e você também pode se beneficiar.


10

Talvez a versão 1.23 do tar permita excluir todos os arquivos de versão da linha de comando, mas infelizmente não funciona na minha versão 1.20:

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

Muito agradável! Eu não sabia sobre essa opção .
Peter Murray

4

Vá para o diretório de trabalho do subversion (checkout) e execute:

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

Se você estiver usando utilitários GNU, também poderá executar:

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

Se possível, eu recomendaria usar o formato ustar ( -H ustar).


3

Eu também vejo:

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

Graças alcatrão.


2

Se bem entendi, você está querendo tar os resultados de um svn checkout?

Então, no pseudocódigo, seria algo parecido com isto:

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

0

Isso é adaptado de uma frase que escrevi. Supõe que você tenha um diretório ~ / tmp. Você precisará alterar as variáveis ​​PROJ e URL nas duas primeiras etapas. O resto deve funcionar.

Para facilitar a cópia:

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

Para facilitar a visualização:

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

Este é o meu esforço de tentar criar um tarball determinístico a partir de um repositório SVN.

Requer o GNU tar 1.27 ou posterior.

Recursos:

  • Tarball determinístico
  • Precisão de carimbo de data e hora em microssegundos do SVN, graças ao paxcabeçalho estendido
  • O ID da revisão armazenado nos comentários do arquivo exatamente como git archivefaria
  • Eu demonstro ambas .tar.gze .tar.xzcompressões. Para gzip, você pode otimizar a compressão mais usando advdefde advancecomp ( advdefusos zopfli biblioteca).

Como exemplo, eu uso o repositório subversion em si como uma fonte para checkout e criação do tarball. Observe que não é dessa maneira que o SVN empacota seus tarballs e não tenho nenhuma relação com o desenvolvimento do SVN. É apenas um exemplo , afinal.

# 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" || : ; }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.