SVN: оформить / экспортировать только структуру каталогов

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


person petr k.    schedule 11.02.2009    source источник
comment
Просто любопытно - зачем тебе это делать?   -  person Tim    schedule 11.02.2009
comment
@Tim: Похоже, хороший способ настроить структуру каталогов для нового проекта на основе структуры существующего проекта.   -  person onnodb    schedule 11.02.2009
comment
@onnodb: Да, но именно поэтому у вас должны быть готовые шаблоны для ваших новых проектов, просто экспортируйте шаблон, и все готово.   -  person mbillard    schedule 11.02.2009
comment
Нет-нет, я хочу выполнить некоторую постобработку структуры каталогов в моих задачах NAnt / MSBuild.   -  person petr k.    schedule 11.02.2009
comment
Я добавлю еще одну причину - у нас есть большая структура SVN, которая используется для многих вещей (не исходный код). Я хочу иметь возможность синхронизировать только те каталоги, которые мне интересны, но мне нужна вся структура локально. Это не обычный путь, но похоже, что это было бы полезно.   -  person Cory Foy    schedule 08.07.2010
comment
Вы должны проверить этот пост (но если глубина каталога слишком велика, возможно, вы не сможете удовлетворить ваши требования), svnbook.red-bean.com/en/1.7/svn.advanced.sparsedirs.html   -  person dreamtale    schedule 20.12.2013
comment
Проверьте эту ветку: stackoverflow.com/questions/4032059/   -  person smwikipedia    schedule 13.03.2016


Ответы (12)


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'

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

person Dave Stenglein    schedule 11.02.2009
comment
Возможно ли это сделать с фактической проверкой SVN? Я хочу иметь копии всех каталогов, которые находятся под контролем версий (то есть: в каждом каталоге есть подпапка .svn, как если бы я выполнял svn co - нерекурсивно для каждой папки). - person Cloud; 05.04.2012
comment
Используйте это вместо этого, если у вас есть пробелы в именах папок: svn ls -R {svnrepo} | grep / $ | xargs -I {} mkdir -p {} - person architectonic; 21.09.2015
comment
мне очень понравилось работать с пустой рабочей копией: resbook.wordpress.com/2011/01/06/ - person i_a; 30.01.2016
comment
Вариант комментария @ Architeonic, позволяющий также обрабатывать имена файлов в кавычках и т. Д .: svn ls -R {svnrepo} | grep "/$" | tr '\n' '\0' | xargs -0 -n 1 mkdir -p - person Robert Fleming; 04.04.2017

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

person Community    schedule 23.07.2009
comment
Не понимаю, как это поможет. --non-recursive, делает то, что говорит: он не возвращается по дереву. Таким образом, это даст вам только объекты верхнего уровня, чего не хочет OP, если у них нет плоской структуры каталогов (куст вместо дерева). - person SQB; 11.06.2014

В инструментах contrib приложения есть скрипт subversion, который создает структуру каталогов с пустыми файлами. Имея немного знаний о Python, совсем несложно пропустить создание файлов.

person jor    schedule 11.02.2009

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

person Anton Gogolev    schedule 11.02.2009

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

person Andrew Gilmartin    schedule 08.08.2011

Это отлично работает

svn ls | xargs svn up -N

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

svn ls | xargs svn up
person Darshan    schedule 24.06.2014

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

Мой код был:

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

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

person user4886484    schedule 11.05.2015

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

person didito    schedule 19.08.2011
comment
Или на том же экране вы можете оставить Checkout depth как Fully recursive, а в кнопке справа под списком с именем Choose Items вы можете снять отметки с файлов, которые не хотите захватывать. - person Canella; 10.11.2011

Мой способ 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());


    }
person granadaCoder    schedule 17.10.2012

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

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

репозитории не должны быть корнем ваших репозиториев, они также могут указывать на каталог.

Не может создать каталоги, содержащие подчеркнутые символы (àéîùç ...), но отлично работает с пробелами. Для тех, у кого есть на это время, я думаю, что это проблема кодирования.

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/$_";
}
person E. Fetille    schedule 30.11.2011

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

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

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

person Mike Houston    schedule 11.02.2009
comment
Если вам просто нужно дерево без каталогов .svn, используйте svn export вместо svn co. - person jblocksom; 11.02.2009

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

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

person 12345    schedule 11.02.2009
comment
Я хочу воспроизвести структуру каталогов репозитория на моем локальном диске, а затем выполнить дальнейшую обработку с помощью других инструментов (NAnt / MSBuild). svn: ignore не имеет значения. - person petr k.; 11.02.2009