在SVN中,有没有办法在树中的所有目录上设置(bugtraq)属性而不检查整个树?
如果没有设置挂钩,我无法直接在存储库中设置属性。即使我可以不确定这会有什么帮助 - 你不能用Tortoise设置递归属性,我怀疑它对命令行客户端来说并不简单。
有稀疏检出 - 但是如果我为每个目录设置深度为空,那么即使我手动检出每个子目录,递归设置属性也不会起作用。
我可以查看整个存储库并使用Tortoise以递归方式在目录上设置bugtraq属性(默认情况下它们不会应用于文件)。但是这需要我为此检查整个存储库。
有没有更好的方法可以解决这个问题?
编辑:
我尝试检出整个存储库并更改根目录下的属性 - 但是提交违反了我们的预提交挂钩:无法更改标记上的属性。在不删除钩子的情况下,看起来我需要手动更改属性(除了标签之外的所有内容)。
答案 0 :(得分:4)
获取所有目录的列表可能是一个很好的第一步。这是一种方法,而不实际检查任何东西:
使用存储库的内容创建一个文本文件:
svn list --depth infinity https://myrepository.com/svn/path/to/root/directory> everything.txt
将其修剪为目录。目录都将以正斜杠结束:
grep“/ $”everything.txt> just_directories.txt
在您的情况下,您需要在文本编辑器中打开它并取出钩子阻塞的标记目录。
由于您已检出存储库,因此可以直接将该文件用作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())