自动添加svn:needs-lock

时间:2009-04-02 18:39:34

标签: svn svn-propset

您好我想知道SVN服务器是否有办法在任何二进制文件而不是文本文件上自动分配svn:needs-lock属性。

我们有一个相当小的开发团队,但是每个人都要记住在新创建的二进制文件上设置这个属性是没有意义的,因为很容易忘记这样的事情。

5 个答案:

答案 0 :(得分:22)

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=*属性。这将导致应用了svn:needs-lock=*属性的每个新添加的 * .exe文件。

您可以在Subversion属性中存储多行值,因此您可以将以下标准svn:needs-lock和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 :(得分:14)

编辑svn配置文件并为自动道具添加条目或使用带有SVN 1.8和更新客户端的svn:auto-props版本化属性。 Read SVNBook

修改

从SVN 1.8中,您可以将svn:auto-props属性应用于存储库的根路径。请参阅此release note并更新SVNBook 1.8 chapter

答案 2 :(得分:5)

需要注意的是,必须在每个正在使用的SVN客户端上配置自动道具方法。因此,当您在新计算机上设置新开发人员或现有开发人员时,您必须记住执行此配置。

如果您都使用TortoiseSVN,则可以在每个结帐的基本文件夹中设置tsvn:autoprops属性,并且所有TortoiseSVN客户都会尊重该属性。

如果你真的想要它,你需要在每个存储库中放置一个pre-commit钩子。可能很容易为此enforcer脚本加工。

如果你有任何python-fu,RepoGuardSVNChecker的继任者)看起来也很有用。

无论你选择哪一个,我都认为没有办法将该属性追溯应用于存储库中的现有文件。但是,您可以在下次提交文件时强制执行它。

答案 3 :(得分:2)

这个Subversion维基上有一个页面,描述了如何自动添加需求锁定的所有不同选项,以及如何保证它已被设置。该页面还提供了示例脚本和配置详细信息:

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

答案 4 :(得分: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