【问题标题】:SVN: Checkout/export only the directory structureSVN:仅签出/导出目录结构
【发布时间】:2010-10-06 22:31:41
【问题描述】:

有没有办法执行 SVN 检出(或导出),它会只获取目录结构;也就是说,没有文件?

【问题讨论】:

  • 只是好奇 - 你为什么要这样做?
  • @Tim:在现有项目的基础上为新项目设置目录结构似乎是一种不错的方式。
  • @onnodb:是的,但这就是为什么您应该为新项目准备好模板,只需导出一个模板就可以了。
  • 不不,我想对我的 NAnt/MSBuild 任务中的目录结构进行一些后处理。
  • 我将添加另一个原因 - 我们有一个用于许多事情的大型 SVN 结构(不是源代码)。我希望能够只同步我关心的目录,但希望整个结构在本地。这不是一个正常的路径案例,但似乎很有用。

标签: svn directory-structure


【解决方案1】:

只是想补充一下,如果您需要在服务器端执行此操作(即不先签出存储库),相当于svn lssvnlook tree --full-paths。 我必须创建一个 50GB 存储库的文件夹结构的副本,并使用我在此处找到的提示来执行此操作,而无需创建整个内容的工作副本。

我的代码是:

svnlook tree /path/to/repo --full-paths | grep "/$" | grep -v "^/$" | xargs -I {} mkdir -p "{}"

grep -v "^/$" 因为输出包含一个 /(即文件系统根文件夹),我不想搞砸。

【讨论】:

    【解决方案2】:

    这很好用

    svn ls | xargs svn up -N
    

    然后,如果您想完全检出其中几个目录,请进入其中并使用

    svn ls | xargs svn up
    

    【讨论】:

      【解决方案3】:
      svn ls -R {svnrepo} | grep "/$" | xargs -n 1 mkdir -p
      

      导出,而不是结帐。

      [更新]

      结帐:

      env REPO={repo} sh -c 'svn ls -R $REPO | grep "/\$" | xargs -n 1 svn co --depth=empty $REPO'
      

      对于太大的东西,这会很慢。

      【讨论】:

      • 是否可以通过实际的 SVN 结帐来做到这一点?我想要一个受版本控制的所有目录的副本(即:每个目录中有一个 .svn 子文件夹,就像我要对每个文件夹执行“svn co --non-recursive”一样)。跨度>
      • 如果您碰巧在文件夹名称中有空格,请使用此选项:svn ls -R {svnrepo} | grep "/$" | xargs -I {} mkdir -p "{}"
      • 很好地让我开始使用一个空的工作副本:resbook.wordpress.com/2011/01/06/…
      • @architectonic 注释的变体,也可以处理带引号的文件名等:svn ls -R {svnrepo} | grep "/$" | tr '\n' '\0' | xargs -0 -n 1 mkdir -p
      【解决方案4】:

      您可以使用这个脚本来列出 repos 并在目录中创建结构。

      用法: perl checkout-structure.pl repos destdir

      repos 不能是你的 repos 的根目录,它也可以是一个目录。

      无法创建包含重音字符 (àéîùç...) 的目录,但可以很好地处理空格。对于那些有时间的人,我认为这是一个编码问题。

      checkout-structure.pl:

      #!perl
      
      my @dirs;
      my $repos = shift;
      my $dest = shift;
      
      @dirs = grep { /\/$/ && /^[^\.]/ } `svn list -R $repos`;
      
      foreach(@dirs) {
          s/\/$//;
          chomp;
          mkdir("$dest/$_") or warn $!." trying to create $dest/$_";
      }
      

      【讨论】:

        【解决方案5】:

        我的 DotNet (LINQ) 方法:

        首先,运行 svn list 命令。并将输出推送到 .xml 文件。

        "svn.exe" list "https://myserver.com:8443/svn/DotNet/src/v40Base/v40/" --recursive --username %USERNAME% --xml >>myfile.xml
        

        然后针对 .xml 文件运行一些 LINQ 代码。

            private static void FindSVNDirectories()
            {
        
                string fileName = @"C:\temp\myfile.xml";
        
                XDocument xDoc = XDocument.Load(fileName);
        
                //XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
                string ns = string.Empty;
        
                //List of directories
                var list1 = from list in xDoc.Descendants(ns + "list")
                            from item in list.Elements(ns + "entry")
                            where item.Attribute("kind").Value=="dir"
                            select new
                               {
                                   mykind = item.Attribute("kind").Value,
                                   myname = (item.Element(ns + "name").Value)
                               };
        
                StringBuilder sb = new StringBuilder();
                foreach (var v in list1)
                {
                    sb.Append(v.ToString() + System.Environment.NewLine );
                }
        
                Console.WriteLine(sb.ToString());
        
        
            }
        

        【讨论】:

          【解决方案6】:

          在 windows 和 TortoiseSVN 上你可以做 Checkout -> checkout depth: 只有这个项目。 这样您就可以获得单个文件夹/文件。您可以通过这种方式重建您的结构(使用 repobrowser)。 有点麻烦,但如果您的目录结构不太复杂,则可行。 我更喜欢通过慢速网络检查数千个小文件(几千兆字节)...

          【讨论】:

          • 或者在同一个屏幕中,您可以将Checkout depth 保留为Fully recursive 并在组合框右下方的按钮中,命名为Choose Items,您可以取消选中您不想要的文件抢。
          【解决方案7】:

          仅签出目录结构是无法排除一个或多个目录被签出的部分解决方法。假设与检出完整源代码相比,检出目录树的成本可以忽略不计。签出版本化目录结构后,我可以使用 Subversion 的更新和sparse directories 有选择地选择哪些目录树应该包含文件。

          【讨论】:

            【解决方案8】:

            有一个python script in the contrib tools of subversion,它使用空文件创建目录结构。 有了一点python知识,跳过创建文件应该不难。

            【讨论】:

              【解决方案9】:

              您可以在 checkout 命令中指定 --non-recursive,可能会帮助您得到您想要的。

              【讨论】:

              • 我看不出这有什么帮助。 --non-recursive,按照它所说的去做:它不会沿着树递归。因此,这只会为您提供顶级对象,这不是 OP 想要的,除非它们具有平面目录结构(灌木而不是树)。
              【解决方案10】:

              没有办法做到这一点,实际上想做这件事有点奇怪,所以现在我很好奇!

              这可能不相关,但您可以通过在相关目录上添加 svn:ignore property 首先防止文件被提交。这对于防止生成的工件(例如文档或缓存文件)被提交特别有用。

              【讨论】:

              • 我想在我的本地驱动器上复制存储库目录结构,然后使用其他工具 (NAnt/MSBuild) 进行进一步处理。 svn:ignore 不相关。
              【解决方案11】:

              SVN 本身无法做到这一点,但如果您只想导出目录结构,请尝试svn ls -R --xml 获取目录结构的 XML 列表,然后手动重新创建它。

              【讨论】:

                【解决方案12】:

                svn help co 的简要介绍中,我看不出有什么方法可以做到这一点。我之前从下载的库(即供应商分支)的新版本更新存储库所做的事情是删除不是 .svn 文件夹的所有内容:

                #!/bin/sh
                find ./ -type f | grep -v .svn | xargs rm -f
                

                如果您试图避免一开始就检查这些文件,这并不是特别有效,但它应该具有相同的结果。

                【讨论】:

                • 如果您只想要没有 .svn 目录的树,请使用 svn export 而不是 svn co。
                猜你喜欢
                • 2010-11-06
                • 1970-01-01
                • 2012-02-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-06-30
                • 2011-03-17
                • 2018-12-19
                相关资源
                最近更新 更多