Подтвердить что ты не робот

SVN: проверка/экспорт только структуры каталогов

Есть ли способ выполнить проверку SVN (или экспорт), которая будет отображать только структуру каталогов; то есть нет файлов?

4b9b3361

Ответ 1

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'

Это будет довольно медленно для чего-либо слишком большого.

Ответ 2

Вы можете указать - нерекурсивный для команды checkout, которая может помочь вам получить то, что вы хотите.

Ответ 4

SVN не может сделать это как таковое, но если вы просто хотите экспортировать структуру каталогов, попробуйте svn ls -R --xml получить XML-список структуры каталогов, а затем заново создайте его вручную.

Ответ 5

Использование для проверки только структуры каталогов является частичным обходным путем для того, чтобы не было возможности исключить из проверки один или несколько каталогов. Предполагается, что стоимость просто проверки дерева каталогов незначительна по сравнению с проверкой полного источника. С проверенной версией структуры каталога я мог бы использовать обновление Subversion и разреженные каталоги, чтобы выборочно выбирать, какие деревья каталогов должны иметь файлы.

Ответ 6

Это прекрасно работает

svn ls | xargs svn up -N

И затем, если вы хотите, чтобы все из этих каталогов были полностью извлечены, зайдите внутрь и используйте

svn ls | xargs svn up

Ответ 7

Просто хотел добавить, если вам нужно сделать это на стороне сервера (то есть не проверять репозиторий вначале), эквивалент svn ls равен svnlook tree --full-paths. Мне пришлось создать копию структуры папок 50 репо и использовать намеки, которые я нашел здесь, чтобы сделать это, не создавая рабочую копию всего.

Мой код:

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

grep -v "^/$", потому что вывод содержал одну/(то есть корневую папку файловой системы), и я не хотел обходиться с этим.

Ответ 8

на окнах и TortoiseSVN вы можете сделать Checkout → checkout depth: только этот элемент. таким образом вы можете получить отдельные папки/файлы. вы можете перестроить свою структуру таким образом (используя repobrowser). немного громоздким, но выполнимым, если ваша структура каталогов не слишком сложна. я предпочел это, проверяя тысячи мелких файлов (несколько гигабайт) по медленной сети...

Ответ 9

Вы можете использовать этот script, который будет svn перечислять репозитории и создавать структуру в каталоге.

использование: perl checkout-structure.pl repos destdir

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/$_";
}

Ответ 10

My DotNet (LINQ) способ сделать это:

Сначала запустите команду svn list. И нажмите вывод в файл .xml.

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

И затем запустите некоторый код LINQ в файле .xml.

    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());


    }

Ответ 11

Я не вижу, что есть способ сделать это из краткого взгляда на svn help co. Что-то, что я сделал раньше для обновления репозитория из новой версии загруженной библиотеки (то есть ветки поставщика), - это удалить все, что не является .svn-папкой:

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

Это не особенно эффективно, если вы пытались избежать проверки этих файлов в первую очередь, но он должен иметь тот же результат.

Ответ 12

Нет никакого способа сделать это, и на самом деле это немного странно, что нужно делать, так что теперь мне любопытно!

Это может быть не актуально, но вы можете помешать тому, чтобы файлы были в первую очередь добавлены, добавив свойство svn: ignore на соответствующих справочников. Это особенно полезно для предотвращения генерирования артефактов, таких как документация или файлы кеша.