代码之家  ›  专栏  ›  技术社区  ›  Simon D

SVN:仅在目录上设置属性

  •  3
  • Simon D  · 技术社区  · 15 年前

    在SVN中,是否有任何方法可以在树中的所有目录上设置(bugtraq)属性而不签出整个树?

    如果不设置挂钩,我无法直接在存储库中设置属性。即使我可以,我也不确定这是否会有帮助——你不能用Tortoise设置递归属性,而且我怀疑用命令行客户端也不会很简单。

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

    有没有比这更好的方法让我错过了?

    编辑:

    2 回复  |  直到 7 年前
        1
  •  4
  •   Darryl    15 年前

    获取所有目录的列表可能是很好的第一步。这里有一种方法可以做到这一点,而无需实际检查任何内容:

    1. 创建包含存储库内容的文本文件:

      svn列表--深度无限 https://myrepository.com/svn/path/to/root/directory &燃气轮机;everything.txt

    2. 将其精简为目录。所有目录都将以正斜杠结尾:

      grep“/$”everything.txt>只是_directories.txt

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

    svn propset myprop myvalue --targets just_directories.txt
    

    我想直接在文件的存储库版本上设置属性,而不首先签出它们,但没有成功。我在每个目录名前面加上了存储库路径( https://myrepository.com/svn/path/to/root/directory svn propset myprop mypropvalue--仅针对_directories.txt 但它给出了一个错误: svn:正在设置非本地目标的属性 https://myrepository.com/svn/path/to/root/directory/subdir1 需要一个基本的修改 . 不确定是否有办法解决这个问题。

        2
  •  4
  •   Simon D    15 年前

    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())