3

SVN では、ツリー全体をチェックアウトせずに、ツリー内のすべてのディレクトリに (bugtraq) プロパティを設定する方法はありますか?

フックを設定しないと、リポジトリにプロパティを直接設定できません。できたとしても、これが役立つかどうかはわかりません.Tortoiseで再帰的なプロパティを設定することはできません.コマンドラインクライアントでは簡単ではないと思います.

まばらなチェックアウトがありますが、各ディレクトリの深さを空に設定すると、各サブディレクトリを手動でチェックアウトしても、再帰的にプロパティを設定できません。

レポジトリ全体をチェックアウトし、Tortoise を使用してディレクトリの bugtraq プロパティを再帰的に設定できます (デフォルトではファイルに適用されません)。しかし、これだけのためにリポジトリ全体をチェックアウトする必要があります。

私が行方不明になっていることを行うためのより良い方法はありますか?

編集:

リポジトリ全体をチェックアウトし、ルートのプロパティを変更しようとしましたが、コミットがコミット前のフックに違反しました: タグのプロパティを変更できません。フックを削除せずに、(タグ以外のすべての) プロパティを手動で変更する必要があるようです。

4

2 に答える 2

4

すべてのディレクトリのリストを取得することは、良い最初のステップかもしれません。実際に何もチェックアウトせずにそれを行う1つの方法は次のとおりです。

  1. リポジトリの内容を含むテキストファイルを作成します。

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

  2. ディレクトリだけに切り詰めます。ディレクトリはすべてスラッシュで終わります。

    grep "/ $" every.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:Setting property非ローカルターゲットの' https://myrepository.com/svn/path/to/root/directory/subdir1 'にはベースリビジョンが必要です。それを回避する方法があるかどうかはわかりません。

于 2009-07-17T20:22:19.243 に答える
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())
于 2009-07-23T15:18:12.297 に答える