我想在提交新文件时将 svn 属性(如 svn:keyword=Id Date Rev Author)添加到文件中。
为此,可能有两个主要选项:
- 客户端:更改 svn 客户端配置中的 autoprops
- 服务器端:使用 commit-hooks 做一些魔术
客户端并不总是可取的,因为需要对客户端设置进行控制。我想在服务器上解决这个问题。如何才能做到这一点。
我想在提交新文件时将 svn 属性(如 svn:keyword=Id Date Rev Author)添加到文件中。
为此,可能有两个主要选项:
客户端并不总是可取的,因为需要对客户端设置进行控制。我想在服务器上解决这个问题。如何才能做到这一点。
Subversion 文档说在服务器端修改提交是个坏主意。
相反,您可以通过 cron(甚至在由提交触发的服务器上)定期执行svn_apply_autoprops脚本的自定义版本之类的操作。svn_apply_autoprops 脚本比你需要的更通用一些,但是设置适当的配置文件应该很简单。
在这篇文章中,subversion 网站正在 apache.org 下迁移,我找不到 contrib 工具的文档。
从 1.8 版开始,可以使用功能存储库指定的配置来自动设置服务器端的属性。
从自动属性设置:
[...] 一组属性定义,所有连接的客户端在对从给定服务器签出的工作副本进行操作时都会自动考虑这些定义。Subversion 1.8 和更新的客户端通过
svn:auto-props
可继承属性支持此类功能。
请注意,您只需要足够新的客户端。下面你会找到一个完整的例子,我使用了 svn 命令行客户端 1.8.8。使用 svn 服务器 1.6.11。
需要 svn 客户端版本 1.8+
jani@dev:/tmp/testrepo/text-files$ svn --version --quiet
1.8.8
在 auto-props 属性设置之前创建的文件
jani@dev:/tmp/testrepo/text-files$ file f?.txt
f1.txt: UTF-8 Unicode text
f2.txt: UTF-8 Unicode text, with CRLF line terminators
f3.txt: ASCII text, with CRLF line terminators
jani@dev:/tmp/testrepo/text-files$
设置自动道具
jani@dev:/tmp/testrepo/text-files$ svn propset svn:auto-props "*.txt = svn:eol-style=LF" .
property 'svn:auto-props' set on '.'
jani@dev:/tmp/testrepo/text-files$ svn proplist -v --recursive
Properties on '.':
svn:auto-props
*.txt = svn:eol-style=LF
jani@dev:/tmp/testrepo/text-files$
使用 CRLF 行终止符创建新文件 f4.txt
jani@dev:/tmp/testrepo/text-files$ file f?.txt
f1.txt: UTF-8 Unicode text
f2.txt: UTF-8 Unicode text, with CRLF line terminators
f3.txt: ASCII text, with CRLF line terminators
f4.txt: UTF-8 Unicode text, with CRLF line terminators
jani@dev:/tmp/testrepo/text-files$
f4.txt 的行终止符在提交后更改
jani@dev:/tmp/testrepo/text-files$ svn add f4.txt
A f4.txt
jani@dev:/tmp/testrepo/text-files$ svn commit -m 'just another test' .
Adding f4.txt
Transmitting file data .
Committed revision 5.
jani@dev:/tmp/testrepo/text-files$ file f?.txt
f1.txt: UTF-8 Unicode text
f2.txt: UTF-8 Unicode text, with CRLF line terminators
f3.txt: ASCII text, with CRLF line terminators
f4.txt: UTF-8 Unicode text
jani@dev:/tmp/testrepo/text-files$ svn proplist -v --recursive
Properties on '.':
svn:auto-props
*.txt = svn:eol-style=LF
Properties on 'text-files/f4.txt':
svn:eol-style
LF
jani@dev:/tmp/testrepo/text-files$
任何时候你有多个人提交,你可能有不一致的颠覆配置。
正如您所说,在客户端级别和服务器级别解决此问题两次:
不要在服务器提交期间自动修改道具。当您的规则有例外并且您无法超越它时,这几乎肯定会咬到您的屁股。
向所有开发人员发送一封电子邮件,其中包含修改其配置文件的说明,如下所示:
小伙伴们注意了: 在您使用的所有盒子上,请修改文件:~/.subversion/config * 在 [杂项] 部分下,取消注释以下行: 启用自动道具 = 是 在 [auto-props] 部分下,添加或取消注释行,以便它们阅读: *.py = svn:eol-style="LF";svn:executable="ON";keywords="Id"; 注意:您可以通过在沙箱目录中执行以下操作来测试它是否有效: 触摸删除.me.py svn 添加删除.me.py ls -al delete.me.py # 你会看到: -rwxrwxr-x 1 krice4 krice4 0 Apr 19 12:05 delete.me.py svn proplist delete.me.py # 你会看到: 'delme.py' 的属性: svn:可执行文件 关键词 svn:eol 风格 svn revert delete.me.py rm删除.me.py
3.发送邮件后,是时候给那些吊带加一条腰带了,因为有些开发者会忘记做他们应该做的事情。因此,每当有人在没有正确设置 props 的情况下提交时,都会创建一个烦人的警告。
我建议使用以下 Python 文件检测钩子。所有人都应该打印警告而不是阻止颠覆操作,如上所述,异常会杀死你。请注意,例外可以向用户发送电子邮件,或向整个开发组发送电子邮件,主题为:
“愚蠢的用户 Kevin 刚刚提交了一个包含标签的文件!”
有关如何编写这些提交挂钩之一,请参阅:http ://wordaligned.org/articles/a-subversion-pre-commit-hook