27

多くのディレクトリとファイルを含む svn リポジトリがあり、ビルド システムは、チェックアウトする前に、リポジトリ内のブランチのすべての svn:externals プロパティを再帰的に見つけることができる必要があります。現在、以下を使用しています。

svn propget svn:externals -R http://url.of.repo/Branch

これには非常に時間がかかり、実際に帯域幅を大量に消費します。クライアントはリポジトリ内のすべての小道具をすべて受け取り、ローカルでフィルタリングを行っているようです (ただし、wireshark では確認していません)。これを行うより速い方法はありますか?できれば、サーバーに目的のデータのみを返すようにする何らかの方法が必要です。

4

6 に答える 6

30

おっしゃるとおり、ネットワーク帯域幅を消費します。ただし、これらのリポジトリがホストされているサーバーにアクセスできる場合は、file://プロトコル経由で実行できます。より高速で、ネットワークを消費しないことが証明されています。

svn propget svn:externals -R file:///path/to/repo/Branch

また、作業コピー全体が配置されている場合は、WC 内で実行することもできます。

svn propget svn:externals -R /path/to/WC

結果をより早く達成するのに役立つことを願っています!

于 2013-05-03T12:11:42.397 に答える
3

私はついに解決策を思いついた。リクエストを複数の小さなsvnリクエストに分割し、それらのそれぞれをスレッドプールで実行されるタスクにすることにしました。この種のsvnサーバーを非難しますが、この場合、svnサーバーはLAN上にあり、このクエリはフルビルド中にのみ行われるため、問題にはならないようです。

import os
import sys
import threading
import ThreadPool

thread_pool = ThreadPool.ThreadPool(8)
externs_dict = {}
externs_lock = threading.Lock()

def getExternRev( path, url ):
    cmd = 'svn info "%s"' % url
    pipe = os.popen(cmd, 'r')
    data = pipe.read().splitlines()

    #Harvest last changed rev
    for line in data:
        if "Last Changed Rev" in line:
            revision = line.split(":")[1].strip()
            externs_lock.acquire()
            externs_dict[path] = (url, revision)
            externs_lock.release()

def getExterns(url, base_dir):
    cmd = 'svn propget svn:externals "%s"' % url
    pipe = os.popen(cmd, 'r')
    data = pipe.read().splitlines()
    pipe.close()

    for line in data:
        if line:
            line = line.split()
            path = base_dir + line[0]
            url = line[1]
            thread_pool.add_task( getExternRev, path, url )

def processDir(url, base_dir):
    thread_pool.add_task( getExterns, url, base_dir )

    cmd = 'svn list "%s"' % url
    pipe = os.popen(cmd, 'r')
    listing = pipe.read().splitlines()
    pipe.close()

    dir_list = []
    for node in listing:
        if node.endswith('/'):
            dir_list.append(node)

    for node in dir_list:
        #externs_data.extend( analyzePath( url + node, base_dir + node ) )
        thread_pool.add_task( processDir, url+node, base_dir+node )

def analyzePath(url, base_dir = ''):
    thread_pool.add_task( processDir, url, base_dir )
    thread_pool.wait_completion()


analyzePath( "http://url/to/repository" )
print externs_dict
于 2012-04-23T18:28:36.020 に答える
3

この宝石をどこで見つけたのかわかりませんが、独自の外部を持つ外部を確認することは非常に便利です:

Windows:
    svn status . | findstr /R "^X"

Linux/Unix:
    svn status . | grep -E "^X"
于 2018-04-20T12:07:41.053 に答える
0

-Rスイッチのために遅いです。リポジトリパス内のすべてのディレクトリでプロパティが再帰的に検索されますが、これは大変な作業です。

于 2012-04-20T13:31:01.373 に答える