SVN i eksport tylko zmodyfikowanych plików

Opublikowany 2 marca 2011, w Linux, Narzędzia, przez Rafał Gałka

Próbowaliście kiedyś wyeksportować z repozytorium SVN tylko te pliki, które zostały zmodyfikowane w określonym zakresie rewizji? Załóżmy, że wprowadziliśmy poprawki w kilku plikach i chcemy tylko je „wrzucić” na serwer docelowy. Bez sensu wydaje się eksportowanie/uploadowanie całości, a chyba najgorsze jest wybiórcze kopiowanie pojedynczych plików na podstawie informacji z log’a SVN… Osoby korzystające z systemu Trac powiedzą „tak, robię to praktycznie codziennie (przykład: widok zmian -> paczka zip)” – ja też z niego korzystam, ale na domowym serwerze developerskim pracuję sam dla siebie i Trac nie jest mi potrzebny…

Wydawało by się, że ta funkcjonalność powinna być dostępna również w innych popularnych narzędziach tj. TortoiseSVN, WebSVN, czy nawet podstawowym, konsolowym kliencie dostępnym w każdej dystrybucji systemu linux – ale niestety nie jest…
Może Wy znacie jakieś narzędzie, które posiada taką opcję?

Ja poradziłem sobie następującym skryptem w bash’u (svnexport.sh):

#!/bin/bash

# trochę przydatnych, standardowych zmiennych
declare -x SCRIPTDIR=`dirname $(cd ${0%/*} && echo $PWD/${0##*/})`
declare -x SCRIPTNAME="${0##*/}"

# opis użycia skryptu
show_usage() {
    echo -e 1>&2 "\033[1;34mUżycie: ./svnexport.sh <repository-path> <target-dir> [<revision-from>] [<revision-to>]"
    echo 1>&2
    echo 1>&2 "Skrypt służy do wyeksportowania plików zmodyfikowanych w określonym zakresie rewizji."
    echo 1>&2 "Jeśli nie określono zakresu rewizji zostaną wyeksportowane wszystkie pliki."
    echo 1>&2 "Jeśli nie określono końcowej rewizji zostanie użyty zakres <revision-from>:HEAD."
    tput sgr0
    exit 128
}

if [ $# -lt 2 ]; then
    show_usage ;
fi

REPOSITORY_PATH=$1
TARGET_DIR=$2
REVISION_FROM=$3
REVISION_TO=$4

if [ $# -eq 2 ]; then
    svn export --force $REPOSITORY_PATH $TARGET_DIR
    exit 0
fi

if [ $REVISION_TO ] && [ $REVISION_FROM -ge $REVISION_TO ]; then
    echo -e 1>&2 '\E[1;31m'"Końcowa rewizja musi być większa od początkowej"
    tput sgr0
    exit 129
fi

if [ ! $REVISION_TO ]; then
    REVISION_TO="HEAD"
fi

# lista zmodyfikowanych plików (pomijamy pliki usunięte)
FILES=`svn diff --summarize -r$REVISION_FROM:$REVISION_TO $REPOSITORY_PATH | grep "^[AM]"`

for line in $FILES 
do
    if [ $line != "A" ] && [ $line != "AM" ] && [ $line != "M" ]; then
        filename=`echo "$line" | sed "s|$REPOSITORY_PATH||g"`
        if [ ! -d $TARGET_DIR$filename ]; then
            directory=`dirname $filename`
            mkdir -p $TARGET_DIR$directory
            svn export -r $REVISION_TO $line $TARGET_DIR$filename
        fi
    fi
done

Wykorzystanie skryptu:

./svnexport.sh <repository-path> <target-dir> [<revision-from>] [<revision-to>]

Przykładowo aby wyeksportować pliki zmodyfikowane od rewizji 25 do 30:

./svnexport.sh http://example.org/svn/myrepo /home/gizmo/myrepo-export 25 30

Należy pamiętać, że zmiany zawarte w rewizji podanej jako początek zakresu nie zostaną uwzględnione. Wynika to ze specyfiki działania polecenia svn diff.

Skrypt jest lekko zmodyfikowaną wersją kodu autorstwa Chris Hope:
- Subversion Command Line Script to export changed files
- Subversion Command Line Script to export changed files V2.

Tagged with:  

6 Responses to SVN i eksport tylko zmodyfikowanych plików

  1. Michał Borychowski pisze:

    Rafał, a Ty nadal na SVNie działasz? Kiedy przesiadka na GITa?!!!

    • Rafał Gałka pisze:

      Wszystko w swoim czasie :) Migracja niestety nie jest taka banalna… ale w prywatnych tematach już trochę GIT’uję :)

  2. Michał Borychowski pisze:

    No nie przesadzaj :) Trzy linijki + odpowiedni plik z userami:

    - git-svn init http://code.yoursite.net/project/trunk/ –no-metadata
    - git config svn.authorsfile ~/users.txt
    - git-svn fetch

    • Rafał Gałka pisze:

      To nie jest takie proste jak Ci się wydaje ;)
      Jak dołożysz do tego LDAP i soft do zarządzania projektami zintegrowany z repozytoriami to jest co migrować…
      Przechodzimy teraz z Trac’a na ActiveCollab więc może będzie okazja się przerzucić.

  3. qba pisze:

    fajny patch, ale… do problemu ktory opisujesz idealny jest rsync z konsoli :)

  4. rocky_mowry pisze:

    Nice post. I was checking continuously this blog and I’m impressed!
    Very helpful info specifically the last part :) I care for such info much.
    I was seeking this certain information for a
    long time. Thank you and good luck.

Odpowiedz na „rocky_mowryAnuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>