Git -svn --ignore-paths

Сейчас я борюсь в течение нескольких часов с опцией -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, все безрезультатно.

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

Спасибо.

Ответ 1

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

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

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

  • Откройте git -svn script в текстовом редакторе. Мой script был <git-dir>/libexec/git-core/git-svn.
  • Найдите подпрограмму is_path_ignored.
  • Добавьте оператор 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 script.

Ответ 2

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

cat .git/config

в Linux или:

type .git\config

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

Ответ 3

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

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

Наконец, я использовал параметр include-path для сканирования только папки с "* Src *" внутри. которые ускоряют сканирование. также воспользуйтесь опцией:
-r, чтобы уменьшить размер истории, которую вы получите в локальном режиме. --no-minim-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 ​​лет назад:-))


EDIT: я не могу добавить комментарий, поэтому я прокомментирую вопрос здесь (недостаточно точки репутации)

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

Ответ 4

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

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

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

Howerver, правильное решение скрывается в нижней части 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

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

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

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

Ответ 6

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

Хотя я не вижу ничего плохого в вашем регулярном выражении для вашего конкретного дерева, я бы рекомендовал использовать ^ caret в начале для указания игнорируемых путей, начиная с корня. Это может помочь парсеру rexexp ускорить поиск и избежать проблем, когда совпадение также может быть найдено глубоко внутри магистрали, например.

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

Ответ 7

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

Этот путь

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

был получен, несмотря на аргумент --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 года).