自动添加svn:需要锁定

自动添加svn:需要锁定,svn,svn-propset,Svn,Svn Propset,您好,我想知道是否有一种方法可以让SVN服务器自动为任何二进制而非文本文件分配SVN:needs lock属性 我们有一个相当小的开发团队,但让每个人记住在新创建的二进制文件上设置此属性是没有意义的,因为很容易忘记这一点。编辑svn配置文件并添加自动道具条目,或者在svn 1.8和更新的客户端上使用svn:auto-props版本化属性 编辑: 从SVN 1.8中,您可以将SVN:auto-props属性应用于存储库的根路径。请参阅此内容并进行更新。应注意,必须在使用的每个SVN客户端上配置au

您好,我想知道是否有一种方法可以让SVN服务器自动为任何二进制而非文本文件分配SVN:needs lock属性


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

编辑svn配置文件并添加自动道具条目,或者在svn 1.8和更新的客户端上使用
svn:auto-props
版本化属性

编辑:


从SVN 1.8中,您可以将
SVN:auto-props
属性应用于存储库的根路径。请参阅此内容并进行更新。

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

如果您都在使用,您可以在每个签出的基本文件夹上设置属性,所有的TortoiseSVN客户都会接受该属性

如果你真的想搞定它,你需要在每个存储库中放一个钩子。脚本可能很容易实现这一点

如果你有任何python fu,它的继承者看起来也会很有用


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

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


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

使用Subversion 1.8,您可以使用新的Subversion在存储库中配置自动道具模式

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

您可以在Subversion属性中存储多行值,因此可以将以下标准svn:needs lock and 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=*
使用预提交挂钩

#!/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

这是一个极好的观点。如果您习惯于在服务器端强制执行(例如在TFS中),那么它不会立即显现出来+1同样也过时了。请参阅SVN 1.8的“存储库指定配置”功能:当心!您必须在每个SVN客户端上分别配置自动道具。无法让服务器自动应用需求锁,至少从svn 1.7开始是这样。TSVN具有用于此的TSVN:auto props属性:@Dan,但您可以创建一个预提交脚本,该脚本拒绝不具有此属性的二进制文件。请注意,无法让服务器自动应用需求锁。本文档说明如何分别配置每个SVN客户端以自动应用需求锁,以及如何配置SVN服务器以拒绝未正确使用需求锁的提交。@DanFabulich现在有方法指示SVN 1.8客户端从存储库应用自动道具。如果*是通配符,*=svn:needs lock=*如果你想简单地将needs lock应用于所有文件类型,那么它会起作用吗?@JonathonCowley我已经用TortoiseSVN 1.8.7(svn 1.8.9)测试过了,并将
svn:auto-props
设置为
*=svn:needs lock=*
完全按照你的要求执行,即“应用”需要锁定设置属性的文件夹下的所有文件。感谢您的快速响应。我自己也会测试的,但我在一台电脑上,我无法访问Subversion。很好!我调整了
pre-commit
hook,以打印带有所需文件的
svn-propset
命令: