自动为新文件添加svn关键字属性(服务器端)

时间:2010-02-23 12:50:01

标签: svn properties server-side pre-commit-hook version-control-keywords

我希望在提交新文件时将svn属性(如svn:keyword = Id Date Rev Author)添加到文件中。

为此,可能有两个主要选择:

  1. 客户端:更改svn客户端配置中的autoprops
  2. 服务器端:使用commit-hooks做一些魔术
  3. 客户端并不总是令人满意,因为需要对客户端设置进行控制。我想在服务器上解决这个问题。如何才能做到这一点。

3 个答案:

答案 0 :(得分:6)

Subversion文档称它是bad idea to modify a commit on the server side

相反,您可以通过cron定期执行类似svn_apply_autoprops脚本的自定义版本(甚至可以在提交触发的服务器上)。 svn_apply_autoprops脚本比你需要的更加通用,但设置适当的配置文件应该是直截了当的。

截至本文,subversion web site正在apache.org下迁移,我无法找到contrib工具的文档。

答案 1 :(得分:2)

从版本1.8开始,可以使用功能repository dictated configuration在服务器端自动设置属性。

来自Automatic Property Setting

  

[...]一组属性定义,所有连接客户端在对从给定服务器检出的工作副本进行操作时会自动考虑。 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

在自动道具属性设置之前创建的文件

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$

答案 2 :(得分:1)

任何时候你有多人提交,你可能会有不一致的颠覆配置。

如您所说,在客户端级别和服务器级别解决此问题两次:

  1. 请勿在服务器提交期间自动修改道具。当你对你的规则有例外并且你无法通过它时,这几乎肯定会让你陷入困境。

  2. 向所有开发人员发送电子邮件,其中包含修改其配置文件的说明,如:

  3.     Attention, teammates:
    
        On ALL the boxes you work on, please modify the file:  ~/.subversion/config 
    
        * under the section [miscellany], uncomment the line: 
        enable-auto-props = yes
    
        under the section [auto-props], add or uncomment lines so they read:
    
        *.py = svn:eol-style="LF";svn:executable="ON";keywords="Id";
    
        Note: you may test this is working by doing the following in your sandbox directory:
    
        touch delete.me.py
        svn add delete.me.py
        ls -al delete.me.py   # you will see:
        -rwxrwxr-x 1 krice4 krice4    0 Apr 19 12:05 delete.me.py
        svn proplist delete.me.py  # you will see:
        Properties on 'delme.py':
          svn:executable
          keywords
          svn:eol-style
        svn revert delete.me.py
        rm delete.me.py
    

    3.发送电子邮件之后,是时候给这些吊带添加腰带,因为有些开发人员会忘记做他们应该做的事情。因此,每当有人提交而没有正确设置道具时,就会创建一个恼人的警告。

    我会建议Python文件的以下检测钩子。所有应该打印警告不会阻止颠覆操作,如上所述,异常会杀死你。请注意,例外情况可以向用户发送电子邮件,或通过电子邮件向整个开发组发送电子邮件:

    “愚蠢的用户凯文刚刚提交了一个带有标签的文件!”

    • 验证svn:executable ON
    • 验证svn:关键字“Id”
    • 验证svn:eol-style“LF”#linux systems
    • 验证文件中没有标签! (这些乱七八糟的东西)

    有关如何编写其中一个提交挂钩的信息,请参阅:http://wordaligned.org/articles/a-subversion-pre-commit-hook