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.
Rafał, a Ty nadal na SVNie działasz? Kiedy przesiadka na GITa?!!!
Wszystko w swoim czasie Migracja niestety nie jest taka banalna… ale w prywatnych tematach już trochę GIT’uję
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
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ć.
fajny patch, ale… do problemu ktory opisujesz idealny jest rsync z konsoli
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.