2009-04-02 2 views
20

Привет, мне было интересно, есть ли способ, которым SVN-сервер может автоматически назначить свойство svn: needs-lock для любого файла, который является двоичным, а не текстовым.Автоматически добавлять svn: needs-lock

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

ответ

13

Редактируйте конфигурационный файл svn и добавьте запись для автоматического реквизита или используйте svn:auto-props версию с SVN 1.8 и более новыми клиентами. Read SVNBook!

EDIT:

С SVN 1.8 вы можете применить svn:auto-props свойство корневого пути вашего хранилища. См. Это release note и обновленный SVNBook 1.8 chapter.

+3

Осторожно! Вы должны настраивать автоматические реквизиты для каждого клиента SVN индивидуально. Невозможно, чтобы сервер автоматически применял блокировку потребностей, по крайней мере, начиная с svn 1.7. –

+2

TSVN имеет свойство tsvn: auto-props, которое используется для этого: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#tsvn-dug-propertypage-tsvn-props – Stefan

+0

@Dan но вы можете создать сценарий предварительной фиксации, который отклоняет двоичные файлы, которые не имеют этого свойства. – greggo

4

Следует отметить, что метод автоматического реквизита должен быть настроен на каждом используемом клиенте SVN. Поэтому, когда вы настраиваете нового разработчика или существующего разработчика на новом компьютере, вам нужно запомнить эту конфигурацию.

Если вы все используете TortoiseSVN, вы можете установить свойство tsvn:autoprops в базовой папке каждой кассы, и это будет выполнено всеми клиентами TortoiseSVN.

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

Если у вас есть python-fu, RepoGuard (преемник SVNChecker) выглядит так, как будто он тоже может быть полезен.

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

+0

Это отличный момент. Если вы привыкли к принудительному выполнению на стороне сервера (например, в TFS), это не сразу видно. +1 – MutantNinjaCodeMonkey

+1

Устаревшее, также. См. «Функция дивергентной конфигурации хранилища» в SVN 1.8: http://subversion.apache.org/docs/release-notes/1.8.html#repos-dictated-config – bahrep

2

В этой вики Subversion есть страница, описывающая все различные параметры автоматического добавления блокировки потребностей и того, как гарантировать ее установку. На этой странице также дает примеры скрипты и информацию о конфигурации:

http://www.orcaware.com/svn/wiki/Automatic_lock-modify-unlock

+1

Обратите внимание, что нет способа, чтобы сервер автоматически применял потребности - замок. В этой документации объясняется, как настроить каждый клиент SVN в отдельности, чтобы автоматически применять блокировку потребностей и как настроить сервер SVN на отклонение коммитов, которые неправильно используют блокировку потребностей. –

+2

@DanFabulich теперь есть способ проинструктировать клиента SVN 1.8 применять авто-реквизиты из репозитория. – bahrep

21

Apache Subversion 1.8 вводящих Repository Dictated Configuration функцию, которая требует SVN 1.8 клиента, но 1,8-сервер не является необходимым, так как это свойство на стороне клиента.

С помощью Subversion 1.8 вы можете настроить шаблоны автоподстановки в репозитории, используя новый Subversion svn:auto-props inherited property.

Например, установите значение svn:auto-props значение *.exe = svn:needs-lock=* в корне вашего репозитория (или путь репозитория, представляющий корень проекта). Это приведет к каждому добавленному * .exe файлу, имеющему свойство svn:needs-lock=*.

Вы можете хранить значения многострочных свойств Subversion, так что вы можете добавить следующий стандартный SVN: потребности блокировки и MIME шаблон для svn:auto-props:

*.bmp = svn:mime-type=image/bmp;svn:needs-lock=* 
*.gif = svn:mime-type=image/gif;svn:needs-lock=* 
*.ico = svn:mime-type=image/x-icon;svn:needs-lock=* 
*.jpeg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.jpg = svn:mime-type=image/jpeg;svn:needs-lock=* 
*.png = svn:mime-type=image/png;svn:needs-lock=* 
*.tif = svn:mime-type=image/tiff;svn:needs-lock=* 
*.tiff = svn:mime-type=image/tiff;svn:needs-lock=*  
*.doc = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.docx = svn:mime-type=application/x-msword;svn:needs-lock=* 
*.jar = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.odc = svn:mime-type=application/vnd.oasis.opendocument.chart;svn:needs-lock=* 
*.odf = svn:mime-type=application/vnd.oasis.opendocument.formula;svn:needs-lock=* 
*.odg = svn:mime-type=application/vnd.oasis.opendocument.graphics;svn:needs-lock=* 
*.odi = svn:mime-type=application/vnd.oasis.opendocument.image;svn:needs-lock=* 
*.odp = svn:mime-type=application/vnd.oasis.opendocument.presentation;svn:needs-lock=* 
*.ods = svn:mime-type=application/vnd.oasis.opendocument.spreadsheet;svn:needs-lock=* 
*.odt = svn:mime-type=application/vnd.oasis.opendocument.text;svn:needs-lock=* 
*.pdf = svn:mime-type=application/pdf;svn:needs-lock=* 
*.ppt = svn:mime-type=application/vnd.ms-powerpoint;svn:needs-lock=* 
*.ser = svn:mime-type=application/octet-stream;svn:needs-lock=* 
*.swf = svn:mime-type=application/x-shockwave-flash;svn:needs-lock=* 
*.vsd = svn:mime-type=application/x-visio;svn:needs-lock=* 
*.xls = svn:mime-type=application/vnd.ms-excel;svn:needs-lock=* 
*.zip = svn:mime-type=application/zip;svn:needs-lock=* 
+1

Если * является подстановочным знаком, будет ли * = svn: needs-lock = * работать, если вы хотите просто применить требования-блокировки ко всем типам файлов? –

+1

@JonathonCowley Я тестировал его прямо сейчас с TortoiseSVN 1.8.7 (SVN 1.8.9) и установил 'svn: auto-props' в' * = svn: needs-lock = * 'именно то, о чем вы спрашиваете, т.е. «применяет» блокировку потребностей ко всем файлам в папке, где вы устанавливаете свойство. – bahrep

+0

Спасибо за очень быстрый ответ. Я бы сам его протестировал, но я нахожусь на ПК, где у меня нет доступа к Subversion. –

1

использовать предварительно совершить крюк

#!/bin/bash 

REPOS="$1" 
TXN="$2" 

SVNLOOK=/usr/bin/svnlook 
ICONV=/usr/bin/iconv 

SVNLOOKOK=1 

# Check files for svn:needs-lock property 
# Exit on all errors. 
set -e 

echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH 
do 
if [[ $REPOS_PATH =~ (A|M|U)[[:blank:]]{3}(.*)\.(.*) ]] 
then 
    if [ ${#BASH_REMATCH[*]} -ge 2 ] 
    then 
    FILENAME=${BASH_REMATCH[2]}.${BASH_REMATCH[3]}; 

    # Make sure every file has the svn:needs-lock property set 
    if [ "" == "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:needs-lock \"$FILENAME\" 2> /dev/null`" ] 
    then 
    ERROR=1; 
    echo "" >&2 
    echo "svn:needs-lock property has to be set on \"$FILENAME\"" >&2 
    echo "" >&2 
    fi 
    fi 
fi 
test -z $ERROR || (exit 1) 
done 

# All checks passed, so allow the commit. 
exit 0 

и предварительно замок крюка

#!/bin/bash 

REPOS="$1" 
PATH="$2" 
USER="$3" 

# If a lock exists and is owned by a different person, don't allow it 
# to be stolen (e.g., with 'svn lock --force ...'). 

# (Maybe this script could send email to the lock owner?) 
SVNLOOK=/usr/bin/svnlook 
GREP=/bin/grep 
SED=/bin/sed 

LOCK_OWNER=`$SVNLOOK lock "$REPOS" "$PATH" | \ 
      $GREP '^Owner: ' | $SED 's/Owner: //'` 

# If we get no result from svnlook, there's no lock, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "" ]; then 
    exit 0 
fi 

# If the person locking matches the lock's owner, allow the lock to 
# happen: 
if [ "$LOCK_OWNER" = "$USER" ]; then 
    exit 0 
fi 
+0

Ницца! Я адаптировал «pre-commit» hook для распечатки команды 'svn propset' с необходимыми файлами: https://gist.github.com/spl/0affe6cc0e06aae6cb46a45b8a9edd36 –

Смежные вопросы