Почему "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
Изменить: это, как известно, ошибка.