21

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

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

4

5 回答 5

22

Apache Subversion 1.8 引入了需要SVN 1.8 客户端的Repository Dictated Configuration功能,但 1.8 服务器不是必需的,因为这是客户端功能。

svn:auto-props使用 Subversion 1.8,您可以使用新的 Subversion继承属性在存储库中配置 auto-props 模式。

例如,将svn:auto-props值设置为*.exe = svn:needs-lock=*存储库根目录(或表示项目根目录的存储库路径)上的属性。这将导致每个新添加的 *.exe 文件都svn:needs-lock=*应用了属性。

您可以在 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=*
于 2013-09-02T11:07:11.477 回答
14

编辑 svn 配置文件并为 auto props 添加一个条目,或者将svn:auto-props版本化属性用于 SVN 1.8 和更新的客户端。阅读SVNBook

编辑:

从 SVN 1.8 开始,您可以将该svn:auto-props属性应用于存储库的根路径。请参阅此发行说明和更新的 SVNBook 1.8 章节

于 2009-04-02T19:14:29.543 回答
5

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

如果您都在使用TortoiseSVN,您可以在每个结帐的基本文件夹上设置tsvn:autoprops属性,所有 TortoiseSVN 客户端都将使用它。

如果您真的想确定它,您需要在每个存储库中放置一个预提交挂钩。执行器脚本可能很容易为此提供工具。

如果您有任何 python-fu,RepoGuard ( SVNChecker的继任者)看起来也很有用。

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

于 2009-04-03T01:57:51.977 回答
2

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

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

于 2010-01-15T10:06:13.980 回答
2

使用预提交挂钩

#!/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
于 2014-09-25T11:25:17.083 回答