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 года).