Клонировать удаленный филиал в удаленном - PullRequest
0 голосов
/ 01 апреля 2020

У меня уже была удаленная ветвь mainline на origin, и теперь я хотел бы клонировать другую удаленную ветвь (назовите ее mainline-clone) из mainline на origin.

Это что я планирую сделать:

git checkout -b mainline-clone origin/mainline

git push -u origin mainline-clone

Но я не уверен, что это правильный путь к go, поскольку mainline-clone изначально настроен на отслеживание origin/mainline, есть ли побочный эффект для ветви origin/mainline после git push -u origin mainline-clone? (Я просто хочу убедиться, что origin/mainline будет целым после этого git push).

Спасибо.

1 Ответ

2 голосов
/ 02 апреля 2020

Это не проблема, но есть более короткий метод:

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 (что я не делаю - это слишком запутанно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...