SVN:仅在目录上设置属性

时间:2009-07-17 14:29:59

标签: svn properties tree tortoisesvn svn-checkout

在SVN中,有没有办法在树中的所有目录上设置(bugtraq)属性而不检查整个树?

如果没有设置挂钩,我无法直接在存储库中设置属性。即使我可以不确定这会有什么帮助 - 你不能用Tortoise设置递归属性,我怀疑它对命令行客户端来说并不简单。

有稀疏检出 - 但是如果我为每个目录设置深度为空,那么即使我手动检出每个子目录,递归设置属性也不会起作用。

我可以查看整个存储库并使用Tortoise以递归方式在目录上设置bugtraq属性(默认情况下它们不会应用于文件)。但是这需要我为此检查整个存储库。

有没有更好的方法可以解决这个问题?

编辑:

我尝试检出整个存储库并更改根目录下的属性 - 但是提交违反了我们的预提交挂钩:无法更改标记上的属性。在不删除钩子的情况下,看起来我需要手动更改属性(除了标签之外的所有内容)。

2 个答案:

答案 0 :(得分:4)

获取所有目录的列表可能是一个很好的第一步。这是一种方法,而不实际检查任何东西:

  1. 使用存储库的内容创建一个文本文件:

    svn list --depth infinity https://myrepository.com/svn/path/to/root/directory> everything.txt

  2. 将其修剪为目录。目录都将以正斜杠结束:

    grep“/ $”everything.txt> just_directories.txt

  3. 在您的情况下,您需要在文本编辑器中打开它并取出钩子阻塞的标记目录。

    由于您已检出存储库,因此可以直接将该文件用作propset操作的输入:

    svn propset myprop myvalue --targets just_directories.txt
    

    我想直接在文件的存储库版本上设置属性,而不先检查它们,但它不起作用。我在每个目录名称前面加上了存储库路径(https://myrepository.com/svn/path/to/root/directory)并尝试了 svn propset myprop mypropvalue --targets just_directories.txt 但是它出错: svn:在非设置属性 - 本地目标“https://myrepository.com/svn/path/to/root/directory/subdir1”需要基础修订。不确定是否有办法解决这个问题。

答案 1 :(得分:4)

我最终使用pysvn绑定编写了一个脚本(非常容易使用)。如果有人想要它,它就在下面。

import sys
import os
from optparse import OptionParser
import pysvn
import re

usage = """%prog [path] property-name property-value

Set property-name to property-value on all non-tag subdirectories in an svn working copy.

path is an optional argument and defaults to "."
"""

class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def main():
    try:
        parser = OptionParser(usage)
        (options, args) = parser.parse_args()

        if len(args) < 2:
            raise Usage("Must specify property-name and property-value")
        elif len(args) == 2:
            directory = "."
            property_name = args[0]
            property_value = args[1]
        elif len(args) == 3:
            directory = args[0]
            property_name = args[1]
            property_value = args[2]
        elif len(args) > 3:
            raise Usage("Too many arguments specified")

        print "Setting property %s to %s for non-tag subdirectories of %s" % (property_name, property_value, directory)

        client = pysvn.Client()
        for path_info in client.info2(directory):
            path = path_info[0]
            if path_info[1]["kind"] != pysvn.node_kind.dir:
                #print "Ignoring file directory: %s" % path
                continue
            remote_path = path_info[1]["URL"]
            if not re.search('(?i)(\/tags$)|(\/tags\/)', remote_path):
                print "%s" % path
                client.propset(property_name, property_value, path, depth=pysvn.depth.empty)
            else:
                print "Ignoring tag directory: %s" % path
    except Usage, err:
        parser.error(err.msg)
        return 2


if __name__ == "__main__":
    sys.exit(main())