【问题标题】:Determine total size of SVN directory/trunk确定 SVN 目录/主干的总大小
【发布时间】:2010-12-16 23:12:57
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: svn download size


    【解决方案1】:

    这是我对答案的修改。它报告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"}'
    

    【讨论】:

    • 不,为了检查
    • 不错的命令。在检查目录之前对其进行了测试,最终本地目录的大小减去 .svn 目录的大小与您的命令给出的大小相匹配
    【解决方案2】:

    使用下面的方法,您可以确定单个文件的大小。

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

    也许你可以看看这个命令找到一个方法?

    【讨论】:

    • 似乎工作正常,但需要很长时间,而且不知道已经吞噬了多少流量。在 PowerShell 中很简单:([xml](svn list --xml --recursive https://svn/repo/path)).lists.list.entry | measure -sum size
    • 没有。外部是另一回事。
    【解决方案3】:

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

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

    获取 xml 需要一些时间,但效果很好。

    【讨论】:

      【解决方案4】:

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

      #------------------------- 显示存储库、修订和个人大小 ----------------- --- 孙 --- 2011-11-14 -- { CSVN_DIR=/opt/csvn cd ${CSVN_DIR} REPO_PREFIX="${CSVN_DIR}/data/repositories" REPO_SUFFIX="分贝/当前" 对于我在`ls ${REPO_PREFIX}/*/${REPO_SUFFIX}` 做 如果 [ -f $i ] 然后 文件名=`ls -l $i` REV_NO=`猫$i` REPONAME=`回显 $i | awk '{ srch="'${REPO_PREFIX}'/"; idx = index($0,srch); xstr=substr($0,idx + 长度(srch)); idx = index(xstr, "/'${REPO_SUFFIX}'");打印 substr(xstr,1,idx-1)}'` #REPONAME=sn_library ${CSVN_DIR}/bin/svn 列表 --verbose --recursive https://vctl.ds.xxxxxx.in:9501/svn/${REPONAME} | awk '开始 {repo="'${REPONAME}'"; rev="'${REV_NO}'";} {print "存储库:" repo" 修订:" rev $0 } ' 菲 完毕 #------------------------- 显示存储库、修订和个人大小 ----------------- --- 孙 --- 2011-11-14 -- }

      #------------------------ 显示存储库版本和总大小 ----- --- 孙 --- 2011-11-14 -- { CSVN_DIR=/opt/csvn cd ${CSVN_DIR} REPO_PREFIX="${CSVN_DIR}/data/repositories" REPO_SUFFIX="分贝/当前" 对于我在`ls ${REPO_PREFIX}/*/${REPO_SUFFIX}` 做 如果 [ -f $i ] 然后 文件名=`ls -l $i` REV_NO=`awk'{打印$1;退出}'$i` REPONAME=`回显 $i | awk '{ srch="'${REPO_PREFIX}'/"; idx = index($0,srch); xstr=substr($0,idx + 长度(srch)); idx = index(xstr, "/'${REPO_SUFFIX}'");打印 substr(xstr,1,idx-1)}'` #REPONAME=sn_library COL_PREFIX="存储库:\t${REPONAME}\t修订号:\t${REV_NO}\t${FILENAME}" COL_PREFIX=`回显 "${COL_PREFIX}" | awk '{xstr = $0; gsub(" ","_",xstr); gsub(":","_",xstr);打印 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 分布在 \t" i "\tfiles/folders "}' 菲 完毕 #------------------------ 显示存储库版本和总大小 ----- --- 孙 --- 2011-11-14 -- }

      【讨论】:

        【解决方案5】:

        您可以使用 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)这样的工具通常在开始对元素求和之前在内存中构建完整的文档树。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多