确定SVN目录/ trunk的总大小

时间:2009-11-16 07:03:58

标签: svn download size

如果您要签出修订版,有没有办法计算/计算svn目录的总大小?

我的互联网下载量有限,所以在下载之前我需要知道它有多大。

谢谢。

6 个答案:

答案 0 :(得分:35)

这是我对答案的修改。它报告svn中某个目录下面有多少文件和总大小。

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

答案 1 :(得分:9)

使用以下内容,您可以确定单个文件的大小。

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

也许您可以查看此命令以找到方法?

答案 2 :(得分:5)

我测试了PowerShell解决方案,只需要一个小小的修正:

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

有一段时间来获取xml,但效果很好。

答案 3 :(得分:2)

采用上述解决方案,以下内容可能会有所帮助

#------------------------- Show Repositories, Revisions and Individual Sizes -------------------- SuN ---  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=`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 "Repository: " repo " Revision: " rev $0 } '
  fi
done
#------------------------- Show Repositories, Revisions and Individual Sizes -------------------- SuN ---  2011-11-14 -- }

#------------------------- Show Versions of Repositories and Total Size -------------------- SuN ---  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

#------------------------- Show Versions of Repositories and Total Size -------------------- SuN ---  2011-11-14 -- }


答案 4 :(得分:1)

我需要基本项目文件夹级别的大小。 这是我使用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

答案 5 :(得分:0)

您可以使用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 checkout的磁盘使用量基本上是上面计算的两倍,因为在checkout中,您在工作目录和.svn特殊目录/目录下的修订缓存中有文件。

或者,如果您不过分担心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)这样的工具通常在开始对元素求和之前在内存中构造完整的文档树。