У меня есть репозиторий SVN с множеством подпроектов, хранящихся в нем. Прямо сейчас в моем post-commit
я просто прохожусь по всем возможным папкам на машине и запускаю svn update
для каждой:
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
Проблема в том, что это медленно и избыточно, когда я просто фиксирую подпапку одного из проектов. Мне интересно, есть ли лучший способ определить, какой из DIRS мне следует использовать итолькообновите это.
Есть ли способ это сделать? Насколько я могу судить, нет способа определить, какая часть репозитория была зафиксирована и, следовательно, какой каталог нужно обновить.
Является ли единственной альтернативой создание отдельного репозитория для каждого проекта? (Вероятно, следовало бы сделать это с самого начала, если так...)
решение1
Мне интересно, есть ли лучший способ определить, какой из каталогов мне следует использовать, и обновлять только его.
svnlook dirs-changed
это то, что вы ищете:
# svnlook dirs-changed -r 40270 /path/to/the/repo
project1/foo/bar
Попробуйте что-то вроде этого:
#!/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"
решение2
Вот скрипт, который я в итоге использовал, основываясь на справке quanta:
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
Обратите внимание, что единственной большой вещью, которую мне пришлось добавить, была declare -A PROJECTS
строка. По какой-то причине ассоциативный массив/хеш не работал, пока я этого не сделал.