web-dev-qa-db-ja.com

SVNディレクトリ/トランクの合計サイズを決定する

リビジョンをチェックアウトする場合、svnディレクトリの合計サイズをカウント/計算する方法はありますか?

私はインターネットのダウンロードを制限しているので、ダウンロードしてダウンロードする前に、何かの大きさを知る必要があります。

ありがとうございます

41
Adam M-W

以下を使用して、個々のファイルのサイズを決定できます。

svn list --verbose --recursive http://svn/repo/path

たぶん、あなたはこのコマンドを見回して方法を見つけることができますか?

9
Dan McGrath

これは私の答えの修正です。 svnの特定のディレクトリの下にあるファイルの数と合計サイズを報告します。

svn list -vR svn://svn/repo/subdir|awk '{if ($3 !="") sum+=$3; i++} END {print "\ntotal size= " sum/(1024*1024)" MB" "\nnumber of files= " i/1000 " K"}'
36
Nico Hailey

PowerShellソリューションをテストしましたが、わずかな修正が必要です。

([xml](svn list --xml --recursive https://svn/repo/path)).lists.list.entry | measure-object -sum size

Xmlを取得するのにはしばらく時間がかかりますが、非常にうまく機能します。

5
Jonathan

上記のソリューションから採用すると、以下が役立つ場合があります

#-------------------------リポジトリ、リビジョン、個々のサイズを表示------------ --------日曜日--- 2011-11-14-{
 
 CSVN_DIR =/opt/csvn 
 
 cd $ {CSVN_DIR } 
 
 REPO_PREFIX = "$ {CSVN_DIR}/data/repositories" 
 REPO_SUFFIX = "db/current" 
 
 
 for i for `ls $ {REPO_PREFIX}/*/$ {REPO_SUFFIX}` 
 do 
 if [-f $ i] 
 then 
 FILENAME = `ls -l $ i` 
 REV_NO = `cat $ i` 
 REPONAME =` echo $ i | awk '{srch = "' $ {REPO_PREFIX} '/"; idx = index($ 0、srch); xstr = substr($ 0、idx + length(srch)); idx = index(xstr、 "/ '$ {REPO_SUFFIX}'"); print substr(xstr、1、idx-1)} '`
 
#REPONAME = sn_library 
 
 $ {CSVN_DIR}/bin/svn list --verbose --recursive https://vctl.ds.xxxxxx.in:9501/svn/${REPONAME} | awk 'BEGIN {repo = "' $ {REPONAME} '"; rev = "'$ {REV_NO}'";} {print "リポジトリ:" repo "リビジョン:" rev $ 0} '
 fi 
 done 
#----- --------------------リポジトリ、リビジョン、個々のサイズを表示--------------------日- -2011-11-14-} 
 

または

#-------------------------リポジトリのバージョンと合計サイズを表示------------ --------日曜日--- 2011-11-14-{
 
 CSVN_DIR =/opt/csvn 
 cd $ {CSVN_DIR} 
 
 REPO_PREFIX = "$ {CSVN_DIR}/data/repositories" 
 REPO_SUFFIX = "db/current" 
 
 
 for i in `ls $ {REPO_PREFIX}/*/$ {REPO_SUFFIX} `
 do 
 if [-f $ i] 
 then 
 FILENAME =` ls -l $ i` 
 REV_NO = `awk '{print $ 1; exit} '$ i` 
 REPONAME = `echo $ i | awk '{srch = "' $ {REPO_PREFIX} '/"; idx = index($ 0、srch); xstr = substr($ 0、idx + length(srch)); idx = index(xstr、 "/ '$ {REPO_SUFFIX}'"); print substr(xstr、1、idx-1)} '`
 
#REPONAME = sn_library 
 COL_PREFIX =" Repository:\ t $ {REPONAME}\tRevision No:\ t $ {REV_NO}\t $ {FILENAME} "
 
 COL_PREFIX =` echo "$ {COL_PREFIX}" | awk '{xstr = $ 0; gsub( ""、 "_"、xstr); gsub( ":"、 "_"、xstr); print xstr;} '`
 
 
 $ {CSVN_DIR}/bin/svn list -vR https://vctl.ds.xxxxxx.in:9501/svn/$ { REPONAME} | awk 'BEGIN {xstr = "' $ {COL_PREFIX} '"} {if($ 3!= "")sum + = $ 3; i ++} END {print xstr "\ tTotal size =\t" sum/1024/1024 "\ tMB" "\ t spread across\t" i "\ tfiles/folders"} '
 
 fi 
 done 
 
#-------------------------リポジトリのバージョンと合計サイズを表示--------------------日曜日--- 2011-11-14-} 
 
 
2
Suresh Nambiar

ベースプロジェクトフォルダーレベルのサイズが必要でした。これは、Powershellを使用してxmlを生成するソリューションと、各基本プロジェクトフォルダーの要約サイズを抽出するC#アプリです。

PS C:\> svn list --xml --recursive https://svn.xy.com:4443/svn/Production/ >svn_extract.xml

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;

namespace SvnProjectSizeFromXml
{
    class Program
    {
        static void Main(string[] args)
        {
            //create svn repository xml file via powershell first:
                //PS C:\> svn list --xml --recursive https://svn.xy.com:4443/svn/Production/ >svn_extract
            //read file via streamreader, extract rootfolders and summarized size - export to csv

            string fileName = @"C:\svn_extract.xml";

            Dictionary<string, Int64> list = new Dictionary<string, Int64>();
            string currentProject="";
            Int64 currentSize=0;

            using (System.IO.StreamReader sr = File.OpenText(fileName))
            {
                string s = String.Empty;
                while ((s = sr.ReadLine()) != null)
                {
                    if (s.Contains("<name>") || s.Contains("</lists>"))
                    {
                        if (s.Contains("</lists>"))
                        {
                            //end of file
                            list.Add(currentProject, currentSize);
                            break;
                        }
                        XmlDocument docNew = new XmlDocument();
                        docNew.LoadXml(s);
                        if (!docNew.InnerText.Contains("/") && !docNew.InnerText.Contains("."))
                        {
                            if (currentProject != docNew.InnerText && currentProject!= "")
                            {
                                //new project, store last one to list 
                                list.Add(currentProject, currentSize);
                                Console.WriteLine(list.Count.ToString());
                            }
                            //new project, init
                            currentProject = docNew.InnerText;
                            currentSize = 0;
                        }
                    }

                    if (s.Contains("<size>"))
                    {
                        XmlDocument docNew = new XmlDocument();
                        docNew.LoadXml(s);

                        currentSize += Int64.Parse(docNew.InnerText);
                    }
                }

                String csv = String.Join(Environment.NewLine,list.Select(d => $"{d.Key};{d.Value};"));

                System.IO.File.WriteAllText(@"C:\output.csv", csv);
            }
        }
    }
}

CSVとして出力:

enter image description here

1
ahxfast

Subversion listコマンドのXMLモードを使用して、ファイルサイズを合計できます。

Linux/UNIXの場合:

$ svn list --xml --recursive http://svn.example.org/module/trunk | awk -F'[><]' \
      '/^ *<size>/ {s+=$3} END {printf("%.1f GiB\n", s/1024/1024/1024)}'

実際のsvnチェックアウトのディスク使用量は、チェックアウトでは作業ディレクトリと.svn特別ディレクトリ/ディレクトリの下のリビジョンキャッシュにファイルがあるため、基本的に上記で計算した値の2倍であることに注意してください。

または、RAM=の使用について過度に心配していない場合は、XPath式を使用して合計を計算します。例:

$ printf '%.1f GiB\n' $(svn list --xml --recursive \
     http://svn.example.org/module/trunk | xmlstarlet sel -t -v \
       'sum(/lists/list/entry/size) div 1024 div 1024 div 1024')

または:

$ printf '%.1f GiB\n' $(svn list --xml --recursive \
     http://svn.example.org/module/trunk | xmllint --xpath \
       'sum(/lists/list/entry/size) div 1024 div 1024 div 1024' -)

多くのファイルがあるリポジトリでこのようなXPathプロセッサを使用すると、xmllint(libxml2を使用)などのツールが要素全体の合計を開始する前にメモリ内に完全なドキュメントツリーを構築することが多いため、メモリ使用量が高くなる可能性があります。

0
maxschlepzig