Есть ли способ выполнить проверку SVN (или экспорт), при которой будет извлекаться только структура каталогов; то есть файлов нет?
SVN: оформить / экспортировать только структуру каталогов
Ответы (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'
Это будет довольно медленно для чего-то слишком большого.
svn ls -R {svnrepo} | grep "/$" | tr '\n' '\0' | xargs -0 -n 1 mkdir -p
- person Robert Fleming; 04.04.2017
Вы можете указать - нерекурсивный команде оформления заказа, это может помочь вам получить то, что вы хотите.
--non-recursive
, делает то, что говорит: он не возвращается по дереву. Таким образом, это даст вам только объекты верхнего уровня, чего не хочет OP, если у них нет плоской структуры каталогов (куст вместо дерева).
- person SQB; 11.06.2014
В инструментах contrib приложения есть скрипт subversion, который создает структуру каталогов с пустыми файлами. Имея немного знаний о Python, совсем несложно пропустить создание файлов.
SVN не может этого сделать, но если вы просто хотите экспортировать структуру каталогов, попробуйте svn ls -R --xml
получить XML-листинг структуры каталогов, а затем воссоздать его вручную.
Использование только проверки структуры каталогов - это частичный обходной путь для невозможности исключить один или несколько каталогов из извлечения. Предполагается, что стоимость простой проверки дерева каталогов незначительна по сравнению с проверкой полного источника. С проверенной версией структуры каталогов я мог затем использовать обновление Subversion и sparse каталоги, чтобы выборочно выбирать, в каких деревьях каталогов должны быть файлы.
Это отлично работает
svn ls | xargs svn up -N
А затем, если вы хотите полностью проверить несколько из этих каталогов, зайдите в них и используйте
svn ls | xargs svn up
Просто хотел добавить, что если вам нужно сделать это на стороне сервера (т.е. не проверять сначала репозиторий), эквивалент svn ls
равен svnlook tree --full-paths
. Мне пришлось создать копию структуры папок репозитория объемом 50 ГБ и использовать найденные здесь подсказки, чтобы сделать это без необходимости создавать рабочую копию всего этого.
Мой код был:
svnlook tree /path/to/repo --full-paths | grep "/$" | grep -v "^/$" | xargs -I {} mkdir -p "{}"
grep -v "^/$"
, потому что на выходе был единственный / (т.е. корневая папка файловой системы), и я не хотел с этим связываться.
в окнах и с TortoiseSVN вы можете сделать Checkout -> checkout depth: only this item. таким образом вы можете получить отдельные папки / файлы. таким образом вы можете перестроить свою структуру (используя репо-браузер). немного громоздко, но выполнимо, если ваша структура каталогов не слишком сложна. Я предпочел это проверять тысячи маленьких файлов (несколько гигабайт) по медленной сети ...
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());
}
Вы можете использовать этот скрипт, который 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/$_";
}
Я не вижу способа сделать это, бегло взглянув на svn help co
. Что-то, что я делал раньше для обновления репозитория из новой версии загруженной библиотеки (то есть ветки поставщика), - это удалить все, что не является папкой .svn:
#!/bin/sh
find ./ -type f | grep -v .svn | xargs rm -f
Это не особенно эффективно, если вы пытаетесь в первую очередь избежать проверки этих файлов, но результат должен быть таким же.
Нет никакого способа сделать это, и на самом деле это немного странно, так что теперь мне любопытно!
Это может не иметь отношения к делу, но вы можете предотвратить создание файлов в первую очередь, добавив svn: ignore свойство в соответствующих каталогах. Это особенно полезно для предотвращения сгенерированных артефактов, таких как документация или файлы кеша.