Ich habe ein SVN-Repository mit vielen darin gespeicherten Unterprojekten. Im Moment post-commit
durchlaufe ich einfach alle möglichen Ordner auf der Maschine und führe svn update
in jedem aus:
REPOS="$1"
REV="$2"
DIRS=("/path/to/local/copy/firstproject" "/path/to/local/copy/anotherproject" ... "/path/to/local/copy/spam")
LOGNAME=`/usr/bin/whoami`
for DIR in ${DIRS[@]}
do
cd $DIR
sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done
Das Problem ist, dass dies langsam und redundant ist, wenn ich nur den Unterordner eines der Projekte übertrage. Ich frage mich, ob es eine bessere Möglichkeit gibt, herauszufinden, welches der DIRS ich verwenden sollte undnuraktualisiere das.
Gibt es eine Möglichkeit, dies zu tun? Soweit ich das beurteilen kann, gibt es keine Möglichkeit festzustellen, welcher Teil eines Repo festgeschrieben wurde und welches Verzeichnis daher aktualisiert werden muss.
Besteht die einzige Alternative darin, für jedes Projekt ein separates Repository zu erstellen? (Wenn ja, hätte man das wahrscheinlich von Anfang an tun sollen …)
Antwort1
Ich frage mich, ob es eine bessere Möglichkeit gibt, herauszufinden, welches DIRS ich verwenden sollte, und nur dieses zu aktualisieren.
svnlook dirs-changed
ist, was Sie suchen:
# svnlook dirs-changed -r 40270 /path/to/the/repo
project1/foo/bar
Versuchen Sie etwas wie Folgendes:
#!/usr/local/bash4/bin/bash
typeset -A IP
typeset -A DOCROOT
PROJECTS="project1 project2"
IP=([project1]="ip1" [project2]="ip2")
DOCROOT=([project1]="/var/www/html/project1/" [project2]="/var/www/html/project2/")
REPO="$1"
REV="$2"
USER='deployer'
PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
ssh -t "$USER@${IP[$PROJECT]}" "cd ${DOCROOT[$PROJECT]} && svn up"
Antwort2
Hier ist das Skript, das ich letztendlich mit der Hilfe von Quanta verwendet habe:
REPO="$1"
REV="$2"
declare -A PROJECTS
PROJECTS=(\
[project1]="/path/to/projects/project1 /path/to/projects/project1-devel" \
[project2]="/path/to/projects/project2 /path/to/projects/project2-devel" \
[project3]="/path/to/projects/project3 /path/to/projects/project3-devel" \
)
PROJECT=`svnlook dirs-changed -r "$REV" "$REPO" | awk -F "/" '{ print $1 }'`
DIRS=${PROJECTS[$PROJECT]}
for DIR in $DIRS
do
cd $DIR
sudo /usr/bin/svn update --accept=postpone 2>&1 | logger
logger "$LOGNAME Updated $DIR to revision $REV (from $REPOS) "
done
Beachten Sie, dass die Zeile das Wichtigste war, das ich hinzufügen musste declare -A PROJECTS
. Aus irgendeinem Grund funktionierte das assoziative Array/Hash nicht, bis ich dies tat.