git-svn --ignore-paths - PullRequest
       2

git-svn --ignore-paths

23 голосов
/ 06 октября 2011

Я борюсь в течение нескольких часов с опцией --ignore-paths для git-svn, пытаясь извлечь только определенные теги из большого репозитория.

Я хочу начать выборку с dev, которая выглядит как

> svn ls http://192.168.0.2/svn/repo/corporation/dev
branches/
tags/
trunk/

Список каталога репозитория для полного набора тегов выглядит следующим образом:

> svn ls http://192.168.0.2/svn/repo/corporation/dev/tags
Acme-4.x/
Acme-5.0/
Acme-5.1/
Acme-5.2/
Acme-5.3/
Acme-5.4/
Acme-5.5/
Acme-5.6/
Acme-5.7/
Acme-5.8/
Acme-5.9/

Я хочу игнорировать все теги до Acme-5.5.

Я пытаюсь инициализировать и получить таким образом:

> git svn init  http://192.168.0.2/svn/repo/corporation/dev
> git config svn.authorsfile ../users.txt
> git svn fetch --ignore-paths="Acme-4.x|Acme-5.0|Acme-5.1|Acme-5.2|Acme-5.3|Acme-5.4"

К сожалению, я все еще вижу выборки в теге Acme-4.x. Выборки проявляются на консоли контрольными путями, такими как

A       ACME4.4/source/database/mssql/components/functions/vssver.scc

Я пробовал несколько вариантов регулярного выражения, в том числе полные пути к тегам, которые я хочу игнорировать, которые через час или два превратились в полное разгром и отчаяние. Я предоставил опцию --ignore-paths для git-svn-init, но все безрезультатно.

Будет ли кто-нибудь достаточно любезен, чтобы прокомментировать, почему регулярные выражения не подавляют выборки на путях, указанных в игнорирующем регулярном выражении.

Спасибо.

Ответы [ 7 ]

30 голосов
/ 13 марта 2012

У меня была такая же проблема сегодня: мое регулярное выражение никогда не совпадет ... Убедитесь, что вы знаете, как на самом деле выглядят целевые пути . Я делал неверное предположение о структуре путей, которые были переданы в мое регулярное выражение.

Чтобы узнать, как выглядят пути, заставляет git-svn выводить каждый путь на консоль , когда он проверяет их:

ПРИМЕЧАНИЕ. На всякий случай сначала создайте резервную копию файла git-svn!

  1. Откройте скрипт git-svn в текстовом редакторе. Мой сценарий был <git-dir>/libexec/git-core/git-svn.
  2. Найдите подпрограмму is_path_ignored.
  3. Добавьте оператор print над первым оператором return следующим образом ...
sub is_path_ignored {
    my ($self, $path) = @_;

    print STDERR "$path\n"; //<-- **ADD THIS LINE**

    return 1 if in_dot_git($path);
    return 1 if defined($self->{ignore_regex}) &&
            $path =~ m!$self->{ignore_regex}!;
    return 0 unless defined($_ignore_regex);
    return 1 if $path =~ m!$_ignore_regex!o;
    return 0;
}

Теперь снова используйте git-svn с переключателем --ignore-paths.

Я понял, что вместо путей типа trunk/baz он на самом деле использовал bar/trunk/baz

Так что вместо

--ignore-paths='^(?:trunk|branches|tags)/baz' 

Мне нужно было использовать

--ignore-paths='^bar/(?:trunk|branches|tags)/baz'

Не забудьте удалить оператор print из скрипта git-svn.

5 голосов
/ 13 марта 2016

Я публикую это для всех, кто также пытался использовать - ignore-paths для извлечения только определенных веток / тегов ...

Через некоторое время мы боролись с - ignore-paths , что привело к следующему шаблону игнорирования всех папок в папке филиалов, кроме папки branchname1 и branchname2 :

--ignore-paths='branches/(?!branchname1|branchname2)'

Hoverver, правильное решение скрыто в нижней части документации GIT SVN :

Также можно получить подмножество веток илитеги, используя разделенный запятыми список имен в фигурных скобках.Например:

[svn-remote "huge-project"]
  url = http://server.org/svn
  fetch = trunk/src:refs/remotes/trunk
  branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
  tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*

Итак, в вашем случае .git / config должно содержать что-то вроде этого:

tags = tags/{Acme-4.x,Acme-5.0,Acme-5.1,Acme-5.2,Acme-5.3,Acme-5.4}:refs/remotes/origin/tags/*
5 голосов
/ 17 октября 2012

Вы также можете просто попробовать:

cat .git/config

в Linux или:

type .git\config

в Windows из вашего нового каталога репозитория, чтобы увидеть URL-адрес выборки, ветви иURL тегов.

3 голосов
/ 17 февраля 2016

У меня похожая проблема и частичное решение для моего дела ...

Контекст:
У нас есть только один SVN-репозиторий для команды Meca, Hardware, Software ... репозиторий - полный беспорядок ... поэтому я пытаюсь использовать регулярные выражения, чтобы уменьшить область сканирования. Через 1 день я просто сдался.

Наконец, я использовал опцию include-path для сканирования только папки с «* Src *» внутри. который ускоряет сканирование. также используйте опцию:
-r, чтобы уменьшить размер истории, вы получите локально.
--no-minimal-url, иначе git-svn будет сканировать весь репозиторий, даже если вы укажете ствол и местоположение филиала.

git svn clone 
-r11213:HEAD 
--prefix svn/
--no-minimize-url
--trunk=/trunk/dev/SW/Code/Controller1
--branches=/branches/SW_team/
--include-paths=.*Src.*
https://svnserver.compagny.com/Project1/
Controller1__git__

обратите внимание, что сейчас мне плевать на теги.

Надеюсь, это поможет, даже это не оригинальный вопрос (5 ​​лет назад :-))


РЕДАКТИРОВАТЬ: я не могу добавить комментарий, поэтому я комментирую вопрос здесь (недостаточно репутации)

1) - можно указать заданные пути для git svn [init / fetch или clone] (я не знаю, есть ли другое поведение)
2) --ignore-paths ожидают регулярное выражение, будьте осторожны с "." означает любой персонаж. Случайно каратер "." также любой персонаж поэтому regex = Acme-5.0 будет соответствовать string = "Acme-5.0", но также string = "Acme-580", все равно должно работать.

2 голосов
/ 16 июля 2015

Будет ли кто-то достаточно любезен, чтобы прокомментировать, почему регулярные выражения не подавляют выборки по путям, указанным в игнорирующем регулярном выражении.* был получен несмотря на аргумент --ignore-paths, потому что он просто не соответствует регулярному выражению.

Между "ACME" и "4.4" в этом пути нет -.И если регулярное выражение чувствительно к регистру, «ACME» не будет соответствовать «Acme».

Это должно сработать лучше:

git svn fetch --ignore-paths="ACME4.x|ACME5.0|ACME5.1|ACME5.2|ACME5.3|ACME5.4"

Обратите внимание, что --ignore-paths предназначается для имен файлов,не теги.


(Держу пари, вы давно решили эту проблему - этому посту 4 года).

0 голосов
/ 17 октября 2011

У меня тоже были странные проблемы с --ignore-paths.В некоторых случаях git-svn игнорирует все регулярные выражения.Я видел одно и то же регулярное выражение, работающее с репозиториями 1 и игнорируемое в репозиториях 2, где оба репозитория имеют одинаковую файловую структуру, но разную историю.Я бы рекомендовал использовать ^ Caret в начале, чтобы указать игнорируемые пути, начиная с корня.Это может помочь анализатору rexexp ускорить поиск и избежать проблем, когда совпадение также может быть найдено глубоко внутри ствола, например.

Я бы использовал что-то вроде --ignore-paths = "^ tags / Acme- (4 |. 5 [0-4]) "

0 голосов
/ 07 октября 2011

Я боролся с точно такой же проблемой и начал редактировать .git / config, чтобы явно перечислить нужные мне ветки или теги.

Этот подход работал хорошо, пока я не наткнулся на хранилище svn с большим количеством веток, поэтому я должным образом добавил те, которые хотел, и пропустил те, которые я не сделал.Но это не удалось с ошибками в файле конфигурации.Метод проб и ошибок, по-видимому, показывает, что существует ограничение на количество ветвей в файле конфигурации или, скорее, на общее число символов между открытием {и закрытием}.

Моя жизнь была бы намного проще, если бы я могпросто создайте регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...