SVN锁定一个目录

时间:2011-03-20 04:27:16

标签: svn command-line

很抱歉,如果这是重复的,我仍然找不到正确的答案..

如何从命令行锁定svn目录?我需要从登记处锁定一个分支

修改
我发现的所有这些答案都要求此人访问svn服务器。这不是我的选择。我在一家公司工作,在这家公司里,源控制机器确实被锁在一个金库中。获得更改身份验证规则的访问是一个我无法解决ATM的过程。

2 个答案:

答案 0 :(得分:7)

您无法锁定目录。您可以创建禁止对目录进行写访问的授权规则。这通常是这类事情的完成方式。您也可以使用预提交钩子,但我认为Subversion的authz是最好的。这是一个链接:

http://svnbook.red-bean.com/nightly/en/svn.serverconfig.pathbasedauthz.html

答案 1 :(得分:2)

我最近通过受http://www.noah.org/engineering/olden/svn_directory_lock.html

启发的解决方案解决了这个问题

该帖子中的特定python脚本是矫枉过正,但我​​将以下内容放在预先提交钩子中以供我的代理使用:

#!/bin/sh

err() { echo ${1+"$@"} 1>&2; } # stderr is sent to user

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

SVNLOOK=/usr/bin/svnlook

# Make sure there is a log message.
#
$SVNLOOK log -t "$TXN" "$REPOS" | grep -q "[a-zA-Z0-9]" 
if [ $? -eq 1 ]
then
  err "ERROR: Must enter a log message for this commit!"
  exit 1
fi

# Usage: locked_dir dir [transaction_id]
locked_dir()
{
  if [ -z "$2" ]; then _tid=""; else _tid="-t $2"; fi
  $SVNLOOK propget $_tid "$REPOS" lock "$1" >/dev/null 2>&1
  if [ $? -eq 0 ]; then echo true; else echo false; fi
}

for d in $($SVNLOOK dirs-changed -t "$TXN" "$REPOS")
do
  locked_before=$(locked_dir $d)
  locked_tx=$(locked_dir $d "$TXN")

  if [ $locked_before = $locked_tx -a $locked_tx = true  ]
  then
    err "ERROR: Directory $d is locked. Delete lock before you commit."
    exit 1
  fi
done

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

现在,你可以简单地使用“svn propset”并提交为你想要锁定的目录创建一个“lock”属性。