Почему "git clone" не принимает refspec?

Похоже, что многие люди пошли на замену git clone с комбо git init && git fetch, Это выглядит довольно глупо, и, к сожалению, такие инструменты, как Дженкинс, не сделают этого за вас. Так почему же git clone не принимает refspec, как это делает git fetch?

В частности, если вы хотите запустить задачу сборки, запускаемую Gerrit, в Jenkins, вам нужно убедиться, что рабочее пространство существует, иначе jenkins не сможет извлечь ревизию, содержащую изменение Gerrit. Это потому, что gerrit использует ref путь, который не входит в число тех, которые выбирает git-клон.

2 ответа

Решение

Пожалуйста, укажите, какое имя используется герритом, которого нет после клона. А просто git clone --origin <gerrit-suitable-origin-name> решать проблему?

Теперь для длинной версии. Ваш вопрос, вероятно, два вопроса вместе взятых. Почему выгодно git init, git remote add а также git fetchи почему нет способа удобно фильтровать refspecs, когда вы изначально клонируете репозиторий?

refspecs - после того, как клон инициализирует репо, поведение remote-refspec для команды заключается в добавлении секции по умолчанию в.gitconfig, которая описывает спецификацию выборки:

[remote "origin"]
url = ssh://host/your.git
fetch = +refs/heads/*:refs/remotes/origin/*

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

[remote "origin"]
url = ssh://host/your.git
fetch = +refs/heads/atari:refs/remotes/origin/atari
fetch = +refs/heads/vertigo:refs/remotes/origin/vertigo

После редактирования выборка будет включать только atari а также vertigo ветви от источника удаленного, и обычно присутствующие master например, наряду со всеми другими ветками, которые могут существовать на удаленном компьютере, игнорируются. Это, конечно, похоже на вариант предоставления refspecs для git fetch в командной строке.

В целом это просто не нужно, и я считаю, что это не чистый дизайн, чтобы иметь возможность поддерживать несколько начальных refspecs заранее на git clone командной строки, с единственной целью размещения их в.gitconfig. Вы можете даже написать то же самое, запустив git clone а потом sed в файле.gitconfig. Также будет проблематично решить, какая ветвь будет исходной для проверки при клонировании, учитывая множество возможных refspecs.

init over clone - при условии, что мы не будем обсуждать более продвинутые git clone настройки, такие как использование --reference, малая глубина с --depthили при создании голых репозиториев различие между init-add-fetch и clone весьма незначительно для вашего повседневного потока.

Обычный клон просто копирует существующий репозиторий и устанавливает "источник" в качестве удаленного источника создания. Это сопровождается незначительными неудобствами - на вас навязывается "исходный" пульт, создаются удаленные ветви отслеживания, настраивается начальная ветка и извлекается HEAD. Однако, если вы начнете с git init Вы немного больше контролируете. Вы можете начать добавлять пульты вручную и извлекать определенные ветки, ничего не проверяя.

Обратите внимание, что многие аспекты git clone поведение может контролироваться переключателями командной строки - так что, возможно, разработчики, которые предпочитают git init просто не в курсе их? В вопросе недостаточно информации, чтобы решить. По сравнению с альтернативами, git clone избавляет вас от необходимости набирать текст, предотвращает тепловую смерть вселенной и устанавливает разумные значения по умолчанию в верхнем потоке - например, владение ветвью отслеживания. Я голосую за клона.

git clone может взять refspec через общий --config вариант:

Установите переменную конфигурации во вновь созданном хранилище; это вступает в силу сразу после инициализации хранилища, но до того, как удаленная история будет извлечена или какие-либо файлы извлечены. [...] Это делает безопасным, например, добавление дополнительных опций извлечения в удаленный источник.

Пример:

 git clone -c remote.origin.fetch=+refs/changes/*:refs/remotes/origin/changes/* https://gerrit.googlesource.com/git-repo

Тем не менее, я только что понял, что это не работает, как ожидалось для меня с git version 2.12.2.windows.2 как changes При клонировании ссылка не получается. Правильно добавляется в .git/config, но мне нужно вручную получить его после клона с помощью

cd git-repo
git fetch

Изменить: это, как известно, ошибка.

Другие вопросы по тегам