Терминология
Git здесь ... не так велика. В частности, термины удаленная ветвь и отслеживающая ветвь вообще не определены. См. gitglossary для определения того, что определено.
Люди, однако, иногда используют фразу remote branch , чтобы обозначить либо имя удаленного отслеживания ветви или результат проверки имен филиалов на пульте . Люди - и книга Git - иногда используют фразу отслеживающую ветвь , чтобы обозначить ветвь с восходящим набором .
Ваше определение remote отслеживающая ветка совпадает с таковой в Gitglossary. Мне не нравится этот термин, поскольку он приводит к тому, что люди отбрасывают прилагательное , отслеживающее , и называют его удаленная ветвь , которую разные люди интерпретируют по-разному. (Я предпочитаю называть это именем для удаленного слежения , хотя это не очень большое улучшение. Главное улучшение, если оно есть, заключается в том, чтобы снова не использовать слово «ветвь».: - ))
Более общий термин, который не страдает от всего вышеперечисленного, это ref (что является сокращением от reference; Я склонен излагать его далеко большую часть времени). Если вы посмотрите на глоссарий Git, вы увидите, что он определен как:
Имя, которое начинается с refs/
(например, refs/heads/master
), которое указывает на имя объекта или другой ref (последний называется символом c ref). Для удобства ссылка может иногда сокращаться при использовании в качестве аргумента команды Git; см. gitrevisions [7] для деталей. Ссылки хранятся в хранилище.
В любом случае: да, вы можете производить произвольные модификации имен, как вы предлагаете. fetch =
строки в вашем .git/config
определяют, как каждый ref изменяется.
Когда вы запускаете git fetch
, первым шагом процесса является то, что ваш Git вызывает какой-то другой Git. URL, по которому ваш Git достигает, что Git происходит из:
- командной строки, если вы, например, запускаете
git fetch https://github.com/owner/repo.git
или - сохраненный URL-адрес под имя remote , в данном случае это имя, хранящееся в
hehe_server
, поскольку вы использовали git fetch hehe_server
.
(Есть несколько других способов указать URL репозитория, так как много истории, которая произошла до того, как были изобретены пульты. Это два распространенных метода.)
Установив это соединение, другой Git затем выплескивает все свои ссылки. 1 Вы можете сами убедиться в этом, используя git ls-remote
:
git ls-remote hehe_server
Вывод этой команды представляет собой набор ссылок и идентификаторов ha sh, которые ваш Git видит, когда их Git представляет их .
В любом случае, ваш Git может теперь взять эти ссылки и работать с ними, как указано в настройках fetch =
. Каждый параметр состоит из refspe c. Refspecs описаны в git fetch
документации , но в основном они состоят из:
- необязательный ведущий
+
символ, означающий сила ; - a источник имя или шаблон;
- символ двоеточия
:
; и - a имя имя или шаблон.
Имя или шаблон источника сопоставляются с именами, представленными другим Git. Полученное имя или шаблон назначения используется для создания имени, которое ваш Git будет создавать или обновлять (или, с помощью --prune
, удалять, если никакое входное имя не соответствует ему).
Здесь есть несколько странных ограничений. В частности, если вы установили несколько имен источников, которые соответствуют одному месту назначения, или одному источнику, который соответствует нескольким местам назначения, это не будет работать. Например:
+refs/heads/master:refs/remotes/hehe_server/foo
+refs/heads/master:refs/remotes/hehe_server/bar
заставляет один источник, master
, отображать на два выхода, и:
[remote "hehe_server"]
fetch = +refs/heads/master:refs/remotes/hehe_server/foo
fetch = +refs/heads/develop:refs/remotes/hehe_server/foo
вызывает два источника, master
и develop
, для сопоставить с одним выходом. Ни один из них не может быть обработан с пользой.
Я хочу переименовать hehe_server/master_remote@local
в hehe_server/master_haha@local
, оставив все остальное таким же. Могу я это сделать?
Вроде да, но в основном нет. В частности, если вы хотите взять их refs/heads/master
и назвать их refs/remotes/hehe_server/master_haha
, эта часть проста:
fetch = +refs/heads/master:refs/remotes/hehe_server/master_haha
делает свое дело. Но если вы теперь хотите взять все оставшиеся имена и обработать их обычным способом:
fetch = +refs/heads/*:refs/remotes/origin/*
вы сказали Git, что refs/heads/master
должно стать двумя именами локально, поскольку вторая строка отображает имя на refs/remotes/origin/master
.
Что это означает, что для того, чтобы это заработало, вы должны:
- связаться с другим Git
- получить полный список всех их названий ветвей
- написать новый набор
remote.hehe_server.fetch
строк, по одной строке на имя ветви, с желаемым отображением: все, кроме их master
отображается как обычно, и их master
отображается странно.
Каждый раз, когда изменяется набор имен ветвей на их сервере, вы должны повторить этот процесс.
1 Новый проводной протокол позволяет фильтровать ссылки на сервере. Без этой фильтрации хранилище с большим количеством тегов и / или веток может израсходовать несколько мегабайт нежелательных данных на ваш Git, прежде чем ваш Git сможет начать с ним полезную беседу. Но это - испуская все ссылки - это то, что происходит со старым протоколом.