在服务器上强制使用svn:eol-style=native?

14

目前为了确保每个新加入到我们项目中的文件的Subversion属性eol-style被设置为native,我们必须在每个开发者的机器上的~/.subversion/config文件中添加以下内容:

[miscellany]
enable-auto-props = yes

[auto-props]
*.java = svn:eol-style=native

在svn服务器上有没有相应的方法实现这个功能?

3个回答

9

没有这个功能。

您可以使用挂钩脚本来查找是否设置了属性,但除此之外是不可能实现的。 Subversion与CVS不同,无法更改提交的代码内容。

《SVN书》中包含有关此问题的说明:

警告

不要尝试使用挂钩脚本修改事务。 典型示例是在提交期间自动设置属性,例如 svn:eol-stylesvn:mime-type。 尽管这听起来像个好主意,但会引起问题。 主要问题是客户端不知道挂钩脚本所做的更改,并且没有办法通知客户端它已经过时。 这种不一致会导致意想不到的行为和错误。

而不是尝试修改交易,在pre-commit挂钩中检查交易并拒绝不符合期望要求的提交要好得多。


有趣。感谢分享链接。听起来这是正确的做法:“不要试图修改事务,最好在预提交钩子中检查事务,如果不符合要求,则拒绝提交。” - Bart
1
为什么这个已经过时了? - Fausto Carvalho Marques Silva

7

仅仅因为Fausto的回答在Subversion 1.8发布后已经过时了


如果使用Subversion 1.8或更新版本,则可以在存储库级别(而不是针对服务器上的所有存储库)使用由存储库指定的配置(请参见Collab博客中的主题)。即,在每个存储库的主干根目录中使用svn:auto-props。


请问您能告诉我如何设置那个仓库的配置吗?那些链接只是展示如何阅读它,而我在谷歌上也找不到任何有用的信息。 - lapis
我在TortoiseSVN的仓库浏览器中找到了一种方法,但控制台方式也很有趣。 - lapis
1
这个答案很有帮助,但需要澄清。OP正在寻找一个在服务器上强制实施的auto-props等效项。这个答案指出了新的和有用的SVN 1.8客户端存储在存储库中的svn:auto-props可继承属性特性,但是需要注意的是:1)这是一个客户端功能,旧的SVN客户端(例如1.7)根本不会使用它,也不会执行道具;2)即使是 SVN 1.8 客户端也可以使用 svn add --no-auto-props,同样不会执行任何道具。总之,你需要一个钩子。 - javabrett

0

我找不到一个直接在pre-commit钩子脚本中检查源代码的svn:eol-style属性的示例。最接近的是check-mime-type.pl,它使用mime-type属性来确定文件是否为文本文件。

将以下脚本插入到pre-commit脚本文件中,将检查提交中添加的所有.cpp/.h文件是否设置了svn:eol-style属性。(它可以轻松扩展以检查其他文件扩展名)。它还将提供消息指示哪些文件缺少svn:eol-style属性。

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

# Get new cpp/h files
ADDFILES=$(${SVNLOOK} changed "$REPOS" -t "$TXN" | sed -n -e '/^A.*\(\.cpp\|\.h\)$/s/^A *//p')
#echo "ADDFILES=$ADDFILES" >&2

# Check files for svn:eol-style property
ESMISSING=''
for f in ${ADDFILES}
do
  if [[ "$(${SVNLOOK} pl ${REPOS} -t ${TXN} ${f})" != *svn:eol-style* ]]
  then
    # output to stderr to include message in svn commit ouput
    echo "No svn:eol-style property set on file $f" >&2
    ESMISSING=1
  fi
done

if [[ -n "$ESMISSING" ]]
then
  exit 1
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接