Это не проблема, но есть более короткий метод:
git push origin origin/mainline:refs/heads/mainline-clone
выполнит эту работу. (Во всех случаях, вероятно, целесообразно сначала выполнить git fetch
, прежде чем выполнять какие-либо другие команды Git.)
Long: что нужно знать
Информация о "отслеживании" ветвлений является чисто местный. Точнее, каждая ветвь в вашем хранилище не имеет ни восходящего, ни одного восходящего. Если ветвь B имеет восходящий поток U , Git скажет, что B"отслеживает" U . 1
Восходящий поток ветви может быть:
- имя удаленного отслеживания или
- имя локальной ветви
Предполагается, что это будут только две опции.
A remote , как origin
- это просто Git хранилище: у него есть собственные имена веток. Если у этих веток есть восходящие потоки, они являются частными для этого другого Git хранилища, и вы не можете ни видеть, ни устанавливать их из своего Git. (Если репозиторий Git находится на GitHub, для этих ветвей не установлены восходящие потоки.)
Каждое имя ветви в любом репозитории Git просто содержит один идентификатор ha sh. Так что вам вообще не нужно этого делать:
git checkout -b mainline-clone origin/mainline
Это создает ваше собственное локальное имя mainline-clone
, устанавливая его в восходящем направлении на origin/mainline
, но вы этого не делаете нужен ваш местный mainline-clone
еще. Вместо этого вы можете просто сделать:
git push origin origin/mainline:refs/heads/mainline-clone
Последний аргумент здесь, origin/mainline:mainline-clone
, это refspe c. Refspe c - это, грубо говоря, пара имен, разделенных двоеточием. Команды git fetch
и git push
- это две команды, которые фактически используют refspecs.
В любом refspe c имя в левой части двоеточия - source и имя справа от двоеточия - пункт назначения . Пункт назначения любого refspe c должен быть именем - обычно это имя ветви или тега, или вы можете указать полное ссылочное имя , например refs/heads/somebranch
или refs/tags/v2.1
или refs/remotes/origin/remotetrackingname
. Иногда источником может быть необработанный идентификатор ha sh (при использовании git push
), хотя здесь это не нужно.
Сама команда git push
означает:
- Вызовите другие Git, по URL или удаленному имени, например
origin
. - Отправьте Git коммит и / или другие объекты, если / как необходимо.
- Тогда попросите Git установить некоторые из его имен - имена ветвей, имена тегов и т. д. - для некоторых идентификаторов ha sh.
Другой Git в этом случае - origin
следовательно, git push origin ...
.
. Коммиты и другие необходимые объекты: никаких объектов вообще; они у вас уже есть.
Идентификатор ha sh, который вы хотите установить, - это ваш собственный origin/mainline
прямо сейчас. Так что это source часть вашего refspe c.
Имя, которое вы хотите, чтобы они установили, было refs/heads/mainline-clone
: то есть, их ветвь с именем mainline-clone
. Использование полностью прописанного имени, как это часто бывает ненужным; вы, вероятно, можете просто написать:
git push origin origin/mainline:mainline-clone
Но явно указав их Git: , это имя ветви не вредно, и если ваш Git этого не делает, их Git решает, следует ли трактовать mainline-clone
как имя ветви, или имя тега, или что-то еще целиком.
Следовательно, вы можете явно в своем git push
сказать используйте мое имя источника / магистраль имени для удаленного отслеживания, чтобы установить их название mainline-clone , указав здесь origin/mainline:refs/heads/mainline-clone
. На самом деле, даже если вы пишете скрипт, было бы разумно использовать:
git push origin refs/heads/origin/mainline:refs/heads/mainline-clone
на случай, если кто-то случайно создаст локальную ветвь (или тег) с именем origin/mainline
. Вы бы сами этого не сделали, конечно. : -)
1 Мне не нравится это использование слова tracking , которое уже сильно перегружено в Git. Обратите внимание, что файл называется отслеженным , если он существует в вашем рабочем дереве и находится в индексе Git, а не отслеживается , если он существует в вашем рабочем дереве но не в индексе Git; это не имеет ничего общего с названиями веток. Между тем, такие имена, как origin/master
, являются именами удаленного отслеживания или, как их называет Git, именами удаленного отслеживания . Это также не имеет ничего общего с именами веток, если только вы не используете для них имя Git (что я не делаю - это слишком запутанно).