目前为了确保每个新加入到我们项目中的文件的Subversion属性eol-style
被设置为native
,我们必须在每个开发者的机器上的~/.subversion/config
文件中添加以下内容:
[miscellany]
enable-auto-props = yes
[auto-props]
*.java = svn:eol-style=native
在svn服务器上有没有相应的方法实现这个功能?
目前为了确保每个新加入到我们项目中的文件的Subversion属性eol-style
被设置为native
,我们必须在每个开发者的机器上的~/.subversion/config
文件中添加以下内容:
[miscellany]
enable-auto-props = yes
[auto-props]
*.java = svn:eol-style=native
在svn服务器上有没有相应的方法实现这个功能?
没有这个功能。
您可以使用挂钩脚本来查找是否设置了属性,但除此之外是不可能实现的。 Subversion与CVS不同,无法更改提交的代码内容。
《SVN书》中包含有关此问题的说明:
警告
不要尝试使用挂钩脚本修改事务。 典型示例是在提交期间自动设置属性,例如
svn:eol-style
或svn:mime-type
。 尽管这听起来像个好主意,但会引起问题。 主要问题是客户端不知道挂钩脚本所做的更改,并且没有办法通知客户端它已经过时。 这种不一致会导致意想不到的行为和错误。而不是尝试修改交易,在pre-commit挂钩中检查交易并拒绝不符合期望要求的提交要好得多。
仅仅因为Fausto的回答在Subversion 1.8发布后已经过时了
如果使用Subversion 1.8或更新版本,则可以在存储库级别(而不是针对服务器上的所有存储库)使用由存储库指定的配置(请参见Collab博客中的主题)。即,在每个存储库的主干根目录中使用svn:auto-props。
svn:auto-props
可继承属性特性,但是需要注意的是:1)这是一个客户端功能,旧的SVN客户端(例如1.7)根本不会使用它,也不会执行道具;2)即使是 SVN 1.8 客户端也可以使用 svn add --no-auto-props
,同样不会执行任何道具。总之,你需要一个钩子。 - javabrett我找不到一个直接在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