Я работаю в команде, которая имеет стандарт именования филиалов, для которого требуется определенный префикс c для филиалов в центральном репозитории git. Этот префикс выглядит следующим образом:
dev/<name>/<topic>
Пример:
dev/john/my-feature
Локально, из соображений здравого смысла, я не хочу иметь дело с префиксом. Это шаблон, который делает набор команд более утомительным. Вместо этого я хочу, чтобы моя ветвь локально была просто <topic>
, что в приведенном выше примере - просто my-feature
.
. Я хочу посмотреть, какой тип pu sh и получить рабочий процесс, к которому я могу построить сделайте этот префикс максимально прозрачным. Во-первых, позвольте мне поделиться некоторыми интересными вариантами конфигурации, которые я в настоящее время установил в своих глобальных .gitconfig
:
[push]
default = current
[remote]
pushDefault = fork
Настройки удаленного указания c могут не иметь значения, но я включил их для полноты. Я хочу поддержать три различных варианта использования:
- Когда я выбираю удаленные ветви, содержащие префикс
dev/john
, я хочу, чтобы они отображались локально в refs/remotes/origin/<topic>
. Например, удаленная ветвь refs/heads/dev/john/my-feature
должна быть извлечена локально в refs/remotes/origin/my-feature
. - Когда я пу sh из локальной ветки
refs/heads/my-feature
в удаленную origin
, она должна отображаться в refs/heads/dev/john/my-feature
на Remote. - Когда я пу sh
refs/heads/master
, на пульте все равно должно быть go до refs/heads/master
. Ветвь master
должна полностью игнорировать префикс.
Вот удаленная конфигурация для origin
в моем репо .git/config
, которая у меня есть до сих пор. Обратите внимание, что я только что тестировал git push
на данный момент, я понимаю, что выборка refspe c не поддерживает первый вариант использования выше.
[remote "origin"]
url = git@mydomain:myrepo
fetch = +refs/heads/dev/john/*:refs/remotes/origin/*
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/master
push = refs/heads/*:refs/heads/dev/john/*
Вот то, что я наблюдал так far:
git fetch origin
пока работает во всех случаях: ветви под refs/heads/dev/john/
отображаются на refs/heads/origin/
. А все остальное - обычное прямое отображение, к которому мы все привыкли. - Выполнение
git push -n origin master
дало ожидаемые результаты. Выполнение git push -n origin my-feature
дало ожидаемые результаты. В частности:
- [новая ветка] my-feature -> dev / john / my-feature
С локальной веткой с именем my-feature
проверил, команда git push -n origin
pu sh не соблюдала push.default
, и вместо этого выдвинула все локальные ветви. Я ожидаю, что push.default
по-прежнему используется в тех случаях, когда настройка remote.origin.push
включает подстановочный знак в refspe c. Без указания исходной ветки, я хочу, чтобы она все еще предполагала, что я нажимаю текущую ветку, но просто сопоставляю ее с другим удаленным номером ссылки.
Документация не поддерживает поведение, которое я Я утверждаю для случая git push -n origin
, из того, что я прочитал. В частности, в документах [git -push] говорится (выделено мое):
Когда в командной строке не указано, что делать в pu sh с <refspec>...
аргументами или --all
, --mirror
, --tags
, команда находит значение по умолчанию <refspec>
, консультируясь с конфигурацией remote.*.push
, и, если она не найдена , учитывает конфигурацию push.default
, чтобы решить, что делать с sh.
Так что все это, я полагаю, является долгим способом окончательно задать вопрос: как заставить git push -n origin
дать мне такое же поведение git push -n origin my-feature
с данной конфигурацией (отмечая, что изменение в Сама конфигурация приемлема?