SVN:ディレクトリのみにプロパティを設定する
-
16-09-2019 - |
質問
SVNでは、ツリー全体をチェックアウトせずに、ツリー内のすべてのディレクトリに(bugtraq)プロパティを設定する方法はありますか?
フックを設定せずにリポジトリ内のプロパティを直接設定することはできません。たとえできたとしても、これが役立つかどうかはわかりません。Tortoise では再帰プロパティを設定できません。また、コマンド ライン クライアントでは簡単ではないと思います。
スパースチェックアウトがありますが、各ディレクトリの深さを空に設定すると、各サブディレクトリを手動でチェックアウトしたとしてもプロパティを再帰的に設定することはできません。
リポジトリ全体をチェックアウトし、Tortoise を使用してディレクトリに bugtraq プロパティを再帰的に設定できます (デフォルトではファイルに適用されません)。ただし、これのためだけにリポジトリ全体をチェックアウトする必要があります。
私が見逃しているもっと良い方法はありますか?
編集:
リポジトリ全体をチェックアウトしてルートのプロパティを変更しようとしましたが、コミットがプリコミットフックに違反しました。タグのプロパティは変更できません。フックを削除しないと、(タグ以外のすべての) プロパティを手動で変更する必要があるようです。
解決
すべてのディレクトリのリストを取得することが、最初のステップとして適切な場合があります。実際に何もチェックせずにこれを行う 1 つの方法は次のとおりです。
リポジトリの内容を含むテキスト ファイルを作成します。
svn list --深さ無限大 https://myrepository.com/svn/path/to/root/directory > すべて.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' には基本リビジョンが必要です. 。それを回避する方法があるかどうかはわかりません。
他のヒント
私は(非常に使いやすいです)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())