25 июня 2009 г. Hooks Триггеры Subversion Svn

Subversion. Автоматическое обновление проекта при помощи хуков

subversion-hooks

В большинстве случаев, при разработке веб-проекта требуется автоматически обновлять рабочую версию, на помощь на приходят свн-хуки!

Начнем с того, что у нас есть веб-проект и нам необходимо создать для него репозиторий, как это сделать я рассказывал в статье "FreeBSD. Установка и настройка Subversion".

Далее, мы будем обновлять наш проект только через репозиторий!

Подготовка проекта

Сначала сделаем импорт веб-проекта в репозиторий:

# svn import /_project_ file:///svn/repos/_project_

Теперь удалим все файлы проекта (не забывайте делать бекапы на всякий случай), и сделаем чекаут:

# cd /_project
# rm -rf *
# svn checkout file:///svn/repos/_project_

Hooks

Хуки срабатывают на разные события Subversion, вот некоторые из них:

  • start-commit - запускается до начала транзакции, может быть использован для проверки прав.
  • pre-commit - запускается в конце транзакции, но до commit, часто используется для валидации данных, например для проверки не пустых лог-собщений.
  • post-commit - запускается после транзакции, может быть использовано для отправки e-mail или для резервирования хранилища.
  • pre-revprop-change - запускается до изменений в ревизии, могут быть использованы для проверки доступа.
  • post-revprop-change - запускается после изменений в ревизии, могут быть использованы для отправки e-mail или для резервирования изменений.

Есть еще "post-lock", "post-unlock", "pre-lock" и "pre-unlock", как видно из названий он срабатывают при блокировке. Я не буду их разбирать, потому что они у меня интереса пока не вызвали.

Post-Commit Hook

Этот хук срабатывает после любого commit'a репозитория, для его активации надо скопировать шаблон и наделить правами на запуск:

# cd /svn/repos/_project_/hooks
# cp post-commit.tmpl post-commit
# chmod u+x post-commit

Далее, отредактируем файл post-commit, закомментируем все лишнее и добавим наши команды для обновления проекта:

cd /_project_ && /usr/local/bin/svn update

Примерного такой вид в результате будет иметь содержимое ваше хука:

#!/bin/sh

#
# ... тут куча комментариев ...
#

REPOS="$1"
REV="$2"

cd /_project_ && /usr/local/bin/svn update

#commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
#log-commit.py --repository "$REPOS" --revision "$REV"

далее, проверим работает ли хук от имени под которым запущен Subversion и выполним его:

# su www
# ./post-commit

Если ответ примерно такой:

At revision тут_номер_ревизии

то все в порядке!

А если нет, то у вас ошибка в хуке, пишите в комментарии - помогу.

Собственно хук готов, теперь его необходимо проверить, сделайте commit и посмотрите, обновился ли ваш проект - если нет, то скорее всего проблемы с правами на запись файлов вашего проекта.

Необходимо разрешить права на запись файлов веб-проекта пользователю/группе от которой запущен subversion, скорее всего это www.

# cd /_project
# chown -R www:www *
# chown -R www:www .*
# chmod -R 775 *
# chmod -R 775 .svn

P.S. Спасибо дуду за помощь в тестировании хук :)

Комментарии

Юра Диденко 16 июля 2009 г. 15:17

У меня вопрос по поводу загадочной строчки
"cd /_project_ && /usr/local/bin/svn update"
если у меня репозитарий находтся в /var/svn а сам веб проект в /var/www
то эту строчку я должен переписать так
"cd /var/svn && /var/www update" ?

а еще вот:

root@server:/var/svn/hooks# su www-data
$ ./post-commit
sh: ./post-commit: Permission denied
(пермишен денайд выдает)

Что делаю не так? Спасибо!

В примере:
свн репозиторий - /svn/repos/_project_/
файлы проекта - /_project_

Из это следует, что вам надо

cd /var/www && /usr/local/bin/svn update
sh: ./post-commit: Permission denied

покажите права на этот файл

Юра Диденко 16 июля 2009 г. 18:04

root@server:/var/svn/hooks# ls -l post-commit
-rwxr--r-- 1 root svn 2041 2009-07-16 16:13 post-commit

я так понимаю сменить владельца надо? (спасибо вы мне очень помогаете)

Юра Диденко, да, смените права на файл и не забывайте, что надо обязательно иметь права на выполнение (x)

зы. пожалуйста :)

Юра Диденко 16 июля 2009 г. 18:27

root@server:/var/svn/hooks# chmod -R g+wsx post-commit
root@server:/var/svn/hooks# ls -l post-commit
-rwxrwsr-- 1 www-data svn 2041 2009-07-16 16:13 post-commit
root@server:/var/svn/hooks# su www-data
$ ./post-commit
./post-commit: 49: /usr/local/bin/svn: not found
./post-commit: 52: /usr/share/subversion/hook-scripts/commit-email.pl: not found
$ exit
я так понимаю первая проблема он не нашел репозиторий все правильно он у меня в /var/svn исправил, вторую опцию я просто закомментировал в файле post-commit

запускаю
root@server:/var/svn/hooks# su www-data
$ ./post-commit
./post-commit: 49: /var/svn: Permission denied
./post-commit: 52: : Permission denied

что-то как-то сложно с правами доступа

/var/svn - это у вас путь до репозитория или до приложения?

Юра Диденко 16 июля 2009 г. 19:06

да это путь до репозитария

ну так надо не путь до репозитория, а путь до приложения

  • вы заходите в каталог где храниться рабочая копия (/var/www)
  • выполняете апдейт (whereis svn)

нам путь до репозитория не нужен

Юра Диденко 16 июля 2009 г. 19:16

svnadmin create /var/svn
chown -R www-data:svn /var/svn
chmod -R g+ws /var/svn

Так был создан репозитарий (я создавал из примера http://habrahabr.ru/blogs/ubuntu/20525/)

  1. У вас Ubuntu?
  2. Какой путь до программы svn? (whereis svn)
Юра Диденко 16 июля 2009 г. 19:22

Если в файле post-commit записать так:
cd /var/www && /usr/local/bin/svn update

то получается следующее:
$ ./post-commit
./post-commit: 50: /usr/local/bin/svn: not found
./post-commit: 53: : Permission denied

Это понятно такого пути просто нет /usr/local/bin/svn , репозитарий находится в папке /var/svn веб каталог он же каталог проекта в папке /var/www

/usr/local/bin/svn - это путь до программы, а не репозитория, и нам нужен путь до программы, а не до репозитория!

выполните комманду

whereis svn
Юра Диденко 16 июля 2009 г. 19:27

root@server:/var/svn/hooks# whereis svn
svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz

я понимаю я туплю, еще раз спасибо вам, за то что нервов еще хватает на переписку со мной ;) спасибо

  1. Вы устанавливали как модуль Apache?
  2. Используете путь вида "http://..."?
  3. Под каким пользователем и группой у вас работает Apache?

/usr/bin/svn - вот это ваш путь, замените "/usr/local/bin/svn" на "/usr/bin/svn"

я понимаю я туплю, еще раз спасибо вам, за то что нервов еще хватает на переписку со мной ;) спасибо
это все форум http://pyha.ru/ меня таким сделал, я все терплю :)

Юра Диденко 16 июля 2009 г. 19:31

Уже лучше стало:

root@server:/var/svn/hooks# su www-data
$ ./post-commit
Пропущено '.'
./post-commit: 53: : Permission denied

))
Я вот так записал:
cd /var/www && /usr/bin/svn update

ок, теперь зайдите в каталог

cd /var/www

и выполните

/usr/bin/svn update
Юра Диденко 16 июля 2009 г. 19:34

root@server:/var/svn/hooks# cd /var/www
root@server:/var/www# /usr/bin/svn update
Пропущено '.'

Аааа что он хочет?)))

Юра Диденко, а вы делали чекаут?

Юра Диденко 17 июля 2009 г. 14:48

да небыло чек аута, я пересоздал репозиторий выполнил чекаут но вот что получил

root@server:/var/svn/hooks# ls -l post-commit
-rwxr-xr-x 1 www-data svn 2030 2009-07-17 14:28 post-commit
root@server:/var/svn/hooks# su www-data
$ ./post-commit
Type 'svn help' for usage.
$

? почему

Покажи содержимое файла "post-commit" (только вырежи оттуда комментарии)

Юра Диденко 17 июля 2009 г. 14:56

Все остальное что выше закоменченно!

REPOS="$1"
REV="$2"
cd /var/www && /usr/bin/svn

#/usr/share/subversion/hook-scripts/commit-email.pl \

# "$REPOS" "$REV" commit-watchers@example.org

root@server:/var/svn/hooks# whereis svn
svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz

рабочий каталог проекта /var/www
чекаут делал вот так:
svn checkout file:///var/svn/social /var/www

(я чувствую где-то какая-то мелочь))

cd /var/www && /usr/bin/svn 

Куда "update" дел?

Юра Диденко 17 июля 2009 г. 18:00

Как вас зовут? я выпью за ваше здоровье сегодня! Спасибо! Вы мне очень помогли!


п.с. выставил всем вложенным файлам и папкам владельца www-data.svn как так получилось, до сих пор не понял, мускул отвалился... еще кое-чего... сижу правлю руками, но твой хук;) работает, и мега круто работает! Спасибо еще раз!

Меня зовут Михаил Андреев :)

мускул отвалился... еще кое-чего
Зарегистрируйтесь на http://pyha.ru/forum и я вам там помогу ;)

Юра Диденко 18 июля 2009 г. 18:05

очень приятно Михаил!

>я понял почему мускул отвалился и как владельца ошибочно установил....

cd /_project

chown -R www:www *

chown -R www:www .* <- зачем вот это делаем?

chmod -R 775 *

chmod -R 775 .svn

.*

для скрытых файлов

можно ли настроить посткоммит так, чтобы файлы сливались на другой сервер по ftp?

Darkside, можно

Здравствуйте. Помогите пожалуйста написать хук.
Мне нужно чтобы после команды update(после обновления номера ревизии) файлы из одной директории копировались в другую.
Я так понимаю что нужно использовать хук post-revprop-change.bat. Нужно добавить в него строку xcopy D:\Repository*.* /d D:\test /s /y > info.txt
Что toe нужно добавить в хук чтобы он заработал?
Спасибо!

Забыл написать, что я это делаю на Windowx XP.

Михаил, а

xcopy D:\Repository*.* /d D:\test /s /y > info.txt 
это вообще у вас работает? Если да, то больше ничего не надо, хотя возможно надо прописать полный путь до xcopy.

Я под виндовс не делал хуков, только под FreeBSD и Linux

Да. Если я вручную запускаю этот батник, то он все выполняет. А если я выполняю команду svn update, то номер ревизии меняется но этот хук не отрабатывает.
Может там нужно прописать какие условия? И если они выполняются то выполнять копирование

А разве у вас нету хука "post-update"?

Неа, нету.Вот все что есть:
post-commit,post-lock,post-revprop-change,post-unlock,post-update,pre-commit,pre-lock,pre-revprop-change,pre-unlock,start-commit
Если я сам сделаю батник с названием post-update.bat и туда вставлю строку копирования, будет работать?

Неа, нету.Вот все что есть: post-commit,post-lock,post-revprop-change,post-unlock,post-update,pre-commit,pre-lock,pre-revprop-change,pre-unlock,start-commit

:)

А не, сорри. Это я уже сам его создал руками. Его не было:)
Я проверил, что если его вручную создать, то он не работает.
Может я что то не правильно делаю.
После команды svn update хук post-update должен автоматически срабаотывать без дополнительных команд и настроек?

Ну, в принципе вам подойдет "post-revprop-change", потестите его, впишите в хук:


echo 'test' >> c:\test.log

И посмотрите - срабатывает ли он. Также можете потестить методом тыка все хуки и узнать, какой вам понадобиться...

Хуки если вручную запускаю отрабатывают как надо. а вот после update не работает:((
Не знаю что еще придумать:(

Я говорю, впишите во все хуки, нечто


echo 'HOOK_NAME' >> c:\test.log

и узнаете, что выполнилось

Я так и сделал. Ни один из хуков на update не сработал. Но зато срабатывает хук post-commit после команд delete и import

А Вы не подскажете еще, на какие команды срабатывает хук post-revprop-change.

Сделал как описанно выше, запуская hook скрипт и получаю

Skipped '.'

Что это может быть?

  1. Скорее всего не там вызываете svn update, покажите хук (только без комментариев в файле).
  2. Вы его вручную сейчас выполняете?

REPOS="$1"
REV="$2"

cd /var/www/vhosts/c2342/night && /usr/bin/svn update

/var/www/vhosts/c2342/night - это мой хомяк :)

и в ручную запускал хук и коппитить пробовал и видел ту же ошибку в логах свн клиента

Собственно вот, запускаю в ручную из домашней дериктории (там, где проект должен лежать)

linux $ /usr/bin/svn update

Skipped '.'

разобрался, моя ошибка.

не сделал

svn import /_project_ file:///svn/repos/_project_

сейчас разбираюсь

Ну так проблема осталась или как?

Пока да :(
Если я в ручную скрипт запускаю - все выполняется корректно, а именно -
если были коммиты - папка проекта обновляется, если небыло коммитов, то так, как написано у вас:

At revision тут_номер_ревизии

Но когда я коммичу, оно мне пишет ошибку

post-commit hook failed (exit code 255) with no output.

пока не могу поять в чем дело :(

  1. Под кем выполняется subversion? Он имеет право писать данные в проект (update)?
  2. У хуков проставлены права на запуск?

1 - не знаю, наверное попробую у хостера узнать. что я заметил, так это то, что на всех папках (в домашней дериктории и папка проекта и свн и прочее хранится) одинаковая группа (не знаю, имеет ли это значение).

2 - да, я когда проверял запускал сам хук файл

vitaly, у вас svn установлен как модуль apache? В хук добавьте инструкцию touch/mkdir для того чтобы потом определить права у созданного файла/каталога

> vitaly, у вас svn установлен как модуль apache?

не знаю :) могу узнать у хостера.

> В хук добавьте инструкцию touch/mkdir ...

т.е. попробовать создать дерикторию, перейти в нее и там попробовать update сделать?

Через хук создайте директорию, после чего посмотрите какие у нее права (команда ls -la)

прописал в хуковом скрипте создание дериктории - ничего не создало :( наверное прав нет (опять таки, запустил в ручную хуковый скрипт - все создало. значит ошибки в "синтаксисе" нет)

Да, скорее всего права, однако рекомендую прописать до программ полный путь, например /bin/mkdir, /bin/cp и т.д.

Узнать можно их через команду whereis (whereis cp)

при выполнении

svn import /var/www/ file:///var/svn/

где /var/www/ - папка проекта
file:///var/svn/ - папка репозитория
файлы из базы репозитория появляются не в /var/www, а в /var/www/svn
и при подключении с удаленного репозитория вылазиет ошибка :
repository moved permanently...

А какие файлы у вас в /var/svn/ ?

Извините, всё напутал в попыхах )

svn import

/var/www/ file:///var/svn/
проходит нормально, появляется содержимое репозитория, а вот после
svn checkout file:///var/svn/
как раз файлы из базы репозитория появляются не в
/var/www, а в /var/www/svn

В /var/svn директории :
conf
dav
db
hooks
locks

Вроде разобрался(ОС Debian) :

svn checkout file:///svn/repos/_project_

для меня выглядит как :

svn checkout file:///var/svn/

только нужно ещё добавить в конце папку проекта /var/www
то есть полностью команды выглядит так :

svn checkout file:///var/svn /var/www

После этого

cd /var/www && /usr/bin/svn update

выдает

At revision 16.

e1da, ну вроде все хорошо :)

adw0rd, извините, забыл поблагодарить, многие говорили мне, что так работать с svn невозможно(видимо очень мало русскоязычных материалов).

e1da, вы о хуках, или о тех примерах команд которые скидывали?

я и о хуках в частности, и о синхронизации svn репозиториев на разных системах.

А если репозиторий и рабочий проект на разных серверах.
Вот пишем на продакшн-сервере:

svn update

Что то не видно тут hooks.

Как можно отловить событие? Хук нашел только в репозитории.

В этом случае надо заходить на удаленный сервак и выполнять svn update. А как это вам решать.
Вот еще почитайте http://wiki.agiledev.ru/doku.php?id=automation:build_package_deploy , может заинтересуетесь.

Допустим задача простая: на "обновленном|update" сайте в шаблоне прописать номер ревизии автоматом. Что бы визуально на разных копиях проекта можно было отследить версию. Наверное самое простое написать скрипт обновления.

Можете создать скрипт, который будет срабатывать при http-запросе. Он будет осведомлен о коммите, после чего будет запускать апдейт.

Это самое простое и не красивое решение.

много букф афтор жжот

тут более понятно http://blog.plastilin.org.ua/2009/05/subversion-svn-freebsd.html

больше интересует как сделать игнорирование папок в хуках например у меня в СВН есть движок и папка files хочю пряму на сервере в СВН поместить рабочую копию минуя копирования папки files с 20 гб

хуки до сих пор не автоматизированы в рабочей копии сайта хранится хлам '.svn'

логично делать хук примерно такой конструкции

svn co 'svn://site.ru/PandoraEngine_v1.0' '/home/thepirat/soundsite/www' --username 'Логин' --password 'Пароль'

логично делать хук примерно такой конструкции

svn co 'svn://site.ru/PandoraEngine_v1.0' '/home/thepirat/soundsite/www' --username 'Логин' --password 'Пароль'

больше интересует как сделать игнорирование папок в хуках например у меня в СВН есть движок и папка files хочю пряму на сервере в СВН поместить рабочую копию минуя копирования папки files с 20 г
чего 20 гигов делают в свн? Сделайте для них


svn ps svn:ignore "*" ./files/
хуки до сих пор не автоматизированы в рабочей копии сайта хранится хлам '.svn

Это не хлам, это фича. Можно всегда откатить либо задиффить файлы, и т.д.
Я средствами nginx лочу доступ ко всем файлам начинающиеся с ".*" и не вижу проблем с хранением "хлама", но если вам не нужно это, то делайте svn export.

логично делать хук примерно такой конструкции
в чем смысл?

чего 20 гигов делают в свн? Сделайте для них
svn ps svn:ignore "*" ./files/
# svn ps svn:ignore "*" ./files/
svn: warning: 'files' is not under version control

ну что мне вам сказать, либо у вас нет каталога ./files/, либо он не под свн

еще проблема после постинга в каталог сайта появляются .mine .r17 .r18 как от них избавтся например до актуальной версии

Удалить файлы, после чего апнуться. Но по нормальному, во время слияния надо коррентно мержить, а если пофиг, то пропускать из репы версию поверх рабочей или наоборот.

Здравствуйте! Прочитав всю тему и комментарии, у меня не получилось сделать так, чтобы после фиксации рабочего проекта, его последняя версия выгружалась из хранилища в указанную папку. Допустим есть хранилище E:/SVN
папка E:/1 - в которой разрабатывается сам проект
и папка E:/2 - сюда должен попадать тот проект после фиксации.
Хотелось бы узнать, как должен выглядеть post-commit.bat в этом случае?

Давайте разберемся по порядку, сначала создайте тесты для проверки работы хука. Например создавайте каталог в post-commit.bat или дописывайте файл, сами придумайте.
После чего, когда удостоверитесь что хук работает, делайте svn export или как вы там хотите выгружать данные в E:/2

Данные хочу выгружать с помощью хука, т.е. автоматизировать процесс обновления файлов на сайте до последней версии. Что бы я ни делал, хук не работает. Либо ничего не происходит, либо "операция завершена неудачно" или как-то там, при этом куча всяких "кракозябр" вылазит при фиксации. Я вот что хочу узнать, как правильно в самом хуке прописать пути.. наверно что-то с синтаксисом не верно. С SVN начал работать совсем недавно..поэтому полный чайник ещё в этом плане.

Я вот что хочу узнать, как правильно в самом хуке прописать пути... наверно что-то с синтаксисом не верно. С SVN начал работать совсем недавно...поэтому полный чайник ещё в этом плане.

пропишите банально в post-commit.bat:

mkdir c:/testdir

и удостоверьтесь что каталог создался

Не создаёт, в окошке фиксации пишет вот это:
post-commit hook failed (exit code 1) with output:
и тут куча непонятного всего...

что делать?

что делать?

привести сюда

и тут куча непонятного всего...

т.е. мне надо полностью весь ответ

вот ошибки:
post-commit hook failed (exit code 1) with output:
"#!" ­Ґ пў«пҐвбп ў­гв७­Ґ© Ё«Ё ў­Ґи­Ґ©
Є®¬ ­¤®©, ЁбЇ®«­пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐв­л¬ д ©«®¬.
.
.
.
и дальше всё в таком же духе, это тестовый хук, который вы говорили сделать.. да и любые другие то же самое выдают.

http://www.artlebedev.ru/tools/decoder/ вот вам на будующее, если текст нечитаем...
а теперь покажите свой хук.

Там не должно быть #!/bin... У вас виндовс, а не никсы :)

Взял стандартный post-commit, удалил всё закомментированное и добавил mkdir c:/testdir
не работало.
дошло до того, что кроме этой строки вообще ничего не осталось((

Это строки недолжно быть не в коем случает, если она есть, то ваш хук на ней и остановится, вызвав ошибку. Что собственно мы и видим

Скажите пожалуйста, что надо прописать\удалить в стандартном пост-коммите?

Я не работаю с Windows, даже не знаю как для нее выглядят хуки. У вас же я так понял есть примеры? Должны идти в комплекте с сабвершеном для Windows.

вот чистый хук:

!/bin/sh

.
.
тут куча закоментированного текста
.
.
REPOS="$1"
REV="$2"

mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
и всё.

А называется он post-commit.bat?

Да, расширение я поменял с tmpl на bat, говорят можно ещё exe, но там что-то ещё надо шаманить.

К сожалению не смогу вам помочь, так как у меня нет Windows, что бы проверить и написать вам готовый хук. Однако вы можете дать мне удаленный доступ по RDP на свой компьютер с Windows

Посмотрите вот эту страничку http://www.svnforum.org/2017/viewtopic.php?t=1694
Возможно она сможет немного помочь

Мне то оно ничем не поможет, это возможно вам поможет. Мне нужна платформа для проверки, а не информация, если вы не может предоставить доступ, то иначе вам я никак не смогу помочь...

Спасибо за терпение и помощь! Всё получилось и прекрасно работает!!!

пожалуйста

Приветствую! Статья - то чего не хватало, для нормальной работы. Но возникла проблемка:
Когда коммичу из черепахи - говорит, что проблема с хуком
post-commit hook failed (exit code 2) with output:
cd: can't cd to /usr/local/www/apache22/data/dev.*.ru
Если же выполняю данный хук из под юзера svn - то всё ок:
su svn
./post-commit
At revision 6
В чём может быть трабла?

Покажите свой post-commit. А svn у вас работает из под пользователя svn?

Разобрался! Для юзера svn каталог www был закрыт. Проблема решил. Огромное спасибо за пост!

Пожалуйста :)

Добрый день. Проблема следующая: сделал экспорт с репозитория в локальную копию с помощью post-commit, но всем файлам, которые экспортируется, во первых, выставляется права -rw-r--r--, а, во вторых, владелец - пользователь, который делает коммит. Как можно с помощью svn выставлять права для файлов, которые экспортируется? Спасибо

странно, владелец должен быть тот от чего имени работает демон subversion, так как именно он запускает post-commit
назначьте файлу post-commit права пользователя от которого работает демон сабвершена и укажите права на запуск только хозяину (rwx------)
ps. по поводу назначения прав, то используйте chmod в post-commit, либо меняйте дефолтные настройки маски прав при создании файлов

решил все проблемы установкой пакета sudo

и

/usr/bin/su - <юзер_в_системе> -c "/home/каталог/svn.sh"

svn.sh

cd <каталог_сайта>;
/usr/local/bin/svn up --username '<логин>' --password '<пароль>';

sudo + subversion - вот что упростит работу с хуками

Александр 17 ноября 2010 г. 16:33

Подскажите, как правильно реализовать export бранчей и транка.

У меня структура хранилища такая: myproject/trunk, myproject/tags, myproject/branches.

При комите в trunk хотелось бы делать так:

svn export file:////home/svn/myproject/trunk /home/site1

А при комите в myproject/branches/branch1

делать так svn export file:////home/svn/myproject/branches/site2 /home/site2
Александр 17 ноября 2010 г. 16:35

Немного ошибся:
при комите в myproject/branches/site2

svn export file:////home/svn/myproject/branches/site2 /home/site2

Если вы имеете ввиду проверку куда экспортировать, то можно получить через "svn log -r 1000 -v" пути и в баше распарсить это дело

После коммита - новые файлы добавляются, а вот при удалении - удаляются из репозитория, но остаются в проекте - не подскажете почему?

А как вы делаете обновление проекта? Через svn export?

Здравствуйте, Михаил.
У меня есть несколько проектов в папке /var/svn/, один из которых называется test. Соответственно я создаю для него post-commit:

REPOS="$1"
REV="$2"

svn checkout file:///var/svn/test /var/www
cd /var/www/svn/test && /usr/bin/svn update

После запуска ./post-commit получаю:

Получена редакция 1.
Пропущено '.'

Что за "Пропущено '.'"?

Зачем каждый раз делаете checkout?

checkout убрал. А Пропущено '.' осталось.

Потомучто вы не сделали checkout туда предварительно.
1. Сделайте сначала чекаут


svn checkout file:///var/svn/test /var/www/test
  1. Запускайте хук без checkout:

REPOS="$1"
REV="$2"
cd /var/www/test && /usr/bin/svn update 

svn checkout file:///var/svn/test /var/www/test
svn: '/var/www/trunk' is already a working copy for a different URL
root@forge:/var/svn/test#
root@forge:/var/svn/test/hooks# ./post-commit
Пропущено '.'

Как так?

Вас это:

svn: '/var/www/trunk' is already a working copy for a different URL 

не смущает? Подчистите сначала /var/www. У вас там видимо остался .svn и т.д.

У меня в /var/www/ остались только ссылка на /var/www/svn/.
root@forge:/var/www/svn# svn checkout file:///var/svn/trunk /var/www/trunk
A /var/www/trunk/trunk
A /var/www/trunk/branches
A /var/www/trunk/tags
Получена редакция 1.
Затем делаю root@forge:/var/svn/trunk/hooks# ./post-commit
Получаю "Пропущено '.'" Что это значит?

Мне нужно в post-commit хуке определять, куда делается комит, тоисть в branch или в trunk.
Есть ли какое либо решение, как можно такое реализовать? Спасибо

  1. post - говорит о том, что это действия "после", а вам надо "до"
  2. я даже непойму почему у вас такая задача появилась. Если вы находитесь в каком-то бранче, то и комитьте туда. Если надо в транк, то перейдите в транк и комитьте.

Лучше объясните зачем вам это, а то кажется что вы не по назначению используете svn

Разрабатывался проект. Комитилось все в trunk. После комита делается экспорт(хуком) в рабочую директорию. На данном этапе проект разбивается на 3 части:
основной, dev, test.
Для dev создается своя ветка. Нужно, чтобы хук не срабатывал, если комит делается с ветки, а только с trunk.

А, извините, теперь я вас понял :)
Я уже продолжительно время не работаю с svn, сейчас все больше hg и git использую. Поэтому могу только подсказать такой ход:
1. Вы пишите в post-commit следующее


!#/bin/sh
echo $@ >> /var/log/post-commit.log
  1. Запускаете коммит с клиентской машины
  2. Смотрите в лог /var/log/post-commit.log и пишите сюда что там есть :)

Лог:
/var/svn/repo 830

тоисть репо и ревизия. Больше ничего нету. Есть какие либо предложения?

Вот нашел одно решение. Может кому то пригодится:
С помощью команды svnlook changed выводим список файлов, которые редактировались.
А дальше парсим вывод и анализируем в post-commit хуке

Ну я и хотел нечто подобное предложить в итоге )

Такой вопрос: почему хук может не вызываться после комита? Был написан коммит, который работал нормально. Его переписали - в результате перестал работать. Для отладки просто сделали хук:

#!/bin/sh

REPO="$1"
REV="$2"

echo "before update" > before.log

Права 775
Пользователи svn.svn
В результате хук не вызываеться

Уже все ок. Глюкануло немного :)

Привет. Мб подскажете в чем может быть проблема?
Сделал svn-hook по аналогии с тем, как описано в статье (разница лишь в том, что svn-сервер(1) и сервер(2), на котором расположен проект - разные и мне необходимо обновлять лишь 1 папку).
Вот кусок кода из post-commit (все остальное закомменчено):

REPOS="$1" REV="$2" /usr/bin/ssh -i /tmp/id_rsa root@11.22.33.44 'cd /storage/www/project/slicing2/ ; svn up'; /bin/mail -s "Slicing2 Updated" test@mail

svn на 1ом сервере работает под пользователем subversion

-rwxr-xr-x 1 subversion subversion 2.2K Feb  1 13:13 post-commit

если я выполняю скрипт вручную, то он исправно обновляет файлы на 2ом сервере и отсылает на e-mail уведомление с номером ревизии. Так же скрипт вроде как срабатывает автоматически, т.е. при каждом коммите он даже отправляет e-mail с указанием номера ревизии, но вот на самом сервере изменений не наблюдается. Как его заставить автоматически обновлять код проекта?

А вы под subversion скрипт ручками запускаете или под собой? Ну типа:

$su subversion
$./post-commit

в первом случае (для su -l subversion):

# cat /etc/passwd | grep subversion
subversion:x:123:56:Subversion:/var/lib/subversion:/dev/null
# su -l subversion
su: exec failed

возможно, что в этом и кроется вся ошибка...

для второго:
Скрипт запускал через ./post-commit

# ./post-commit
At revision 2567.

Вот и сейчас: за ночь было 3 коммита от программистов. На каждый коммит мне упало по письму на e-mail с номером ревизии. Но никаких изменений в проекте на сервере не замечено =/

использую svn вместе с ssh авторизацией.
smartsvn ходит туда по линку: ssh+svn://servername/var/lib/svn/project
написал post-commit:
cd /var/www && /usr/bin/svn co file:///var/lib/project

хук выполняется от пользователя user (я им хожу через ssh). т.е. хакинув в хук тестовое mkdir /var/www/test
получаю директорию принадлежащую user:user и с должными правами.

если делаю su user и выполняю post-commit То всё отрабатывает как надо.
если делаю коммит - то не работает. т.е. он выполняет всё (тестовое создание директории, выводы в логи) но вот именно чекаут (или апдейт) не делает...

описался, в хуке написано так:
cd /var/www && /usr/bin/svn co file:///var/lib/svn/project

попробовал вариант описанный тут: http://subversion.apache.org/faq.html#website-auto-update
написал, откомпилировал, сделал cron таск для !рута! - 0 эффекта. лог файл пустой. все логи говорят что таск запускают.
такое ощущение что svn, будучи запущен кроном или хуком просто выходит. без ошибок и прочих "мелочей"...
any ideas? :(

ОС Debian. Настроен svn и post-commit по вашей инструкции. Все работало нормально. Сейчас после коммита через клиент не отрабатывает post-commit.
Помогите пожалуйста. Изменений никаких не производилось. Вроде-бы все права и владельцев проверил.

Если я выполняю из консоли su www-data cd /var/lib/svn/projact $$ /usr/bin/svn update, то коммит проходит. Если коммит делается из программы клиента, коммит проходит, но в проекте изменений не появляется.

Здравствуйте,
У меня не выполняется файл из под пользователя svn
$ ./post-commit
svn: Can't open file '.svn/lock': Permission denied
svn: Can't open file '.svn/lock': Permission denied

Права все проставлены. Куда капнуть?

Судя по приведенному вами ответу от post-commit у вас как раз таки проблема с правами. Выполните:


ls -la .svn/lock

и рещультат выведите сюда

Здравствуйте, не можете ли вы мне помочь (или направить внимательнее читать комментарии)
Проблема: после запуска ./post-commit
Ошибка:./post-commit: 50: /hooks/mailer.py: not found

Может чтоит закоментировать 50-ю строку в post-commit, так как видимо у вас и вправду нет /hooks/mailer.py :)

По хорошему, нужно каждый раз удалять корень проекта и делать # svn co ...

Доброго времени суток. Я, можно сказать, почти не знаком с svn-ом (очень поверхностно), поэтому разобраться трудновато(
Можно получить небольшую консультацию, если не сложно?

У меня есть сайт, который лежит на ftp, есть репозиторий в svn, в котором лежит копия сайта. Необходимо, что бы после комита svn обновлял измененные файлы помимо svn-а еще и на ftp. Права на чтение и запись везде есть. Нет ли образца Post-commit hook с подробными комментариями где что прописывать?

Буду очень признателен! Заранее спасибо!

P.S. прошу не ругаться если написал глупость, я только учусь.

Оставлю здесь на всякий случай решение проблемы 'Warning: post-commit hook failed (exit code 255) with no output.':

!/bin/bash в начале post-commit скрипта

Александр 20 апреля 2012 г. 21:26

вылетает ошибка
post-commit hook failed (exit code 1) with output:
Error: Authentication realm: Subversion repository
Error: Password for 'www': Authentication realm: Subversion repository
Error: Username: svn: E170001: Unable to connect to a repository at URL 'http://domen/svn/project'
Error: svn: E170001: OPTIONS of 'http://domen/svn/project': authorization failed: Could not authenticate to server: rejected Basic challenge (http://domen)

Александр 20 апреля 2012 г. 21:26

Я зашел на сервер под пользователем www (апач) от имени которого и запускается хук и попытался запустить хук вручную, он запросил пароль для этого самого пользователя www. После ввода пароля хук успешно отработал. Как я понял вся проблема и заключается именно в этом запросе пароля. Как решить эту проблему?
Спасибо за внимание! Буду благодарен за помощь.

Покажите сожержимое вашего хука, который вы запускаете из под www,
потом сделайте ls -la <файл_хука>
и покажите историю ввода команд из под www когда вы запускаете хук

Александр 20 апреля 2012 г. 22:04

содержание хука такое же как написано у вас
ls -la
-rwxr--r-- 1 www www ...

Тогда почему у вас спрашивается пароль? sudo или нечто подобного в хуке нет

Александр 20 апреля 2012 г. 22:11

ну вот и я не знаю) буду копать дальше

Помогите настроить post-commit для centos.Основной(1) репозиторий на одном сервере.Другой(2) сервер на бранче.И нужно чтобы при комите этого бранча делался svn up на сервере(2).Такое возможно?

Другой(2) сервер на бранче

Что значит "сервер на бранче"? На сервере N2 копия от какого-то бранча вашего репозитория?

Такое возможно?

Да.

Добрый день! прошу помощи в простой задаче, в которой не могу разобраться...
я поставил svn, и мне нужно запретить заливать в него файлы с определёнными расширениями, и папки с определёнными названиями. как я понял нужно пользоваться hook'ами. Подскажите как это сделать... Спасибо.

Нет, это делается через http://adw0rd.com/2009/03/28/svn-authz-access/ и прочитайте комментарии, ваш случай http://adw0rd.com/2009/03/28/svn-authz-access/#comment-6034

Нет, я имел ввиду что человек может заливать картинки и документы(.jpg, *.doc) и прочее, но к примеру не может заливать исполняемые файлы(.exe).
с папками также... только где-то в подпапках небыло папок с названием ( (...)/POGRAM ).

Вы переходили по ссылкам? Видел комментарий другого человека, на который я дал ссылку?

Достаточно указать относительный путь к самому файлу

Можете конечно и хуки использовать, что имеено у вас не получилось с хуками? Вы же пробовали разобраться с ними?

комментарий видел. спасибо!
только так и не понял как забить относительный путь, чтоб глубина папки была любой.
с хуками испугался разбираться.. понятно что pre-commit, ну в принципе это всё что пока понятно..

Столкнулся с такой проблемой - настроил хук по вашей статье, однако при попытке выполнить commit изменения на сервер попадают, но клиент зависает без каких либо ошибок, а на сервере висит процесс svn update. Если указывать любые другие команды - то все проходит идеально. Что это может быть?

Разобрался - для запуска svn update он хочет чтобы ввели логин и пароль пользователя, под которым запущен svnserv

Написал краткий ман по использованию svn+hooks http://unix-way.ru/index.php/shpargalka-po-komandam-nix/svn-repozitorij

Оставьте свой комментарий

Markdown