TL; DR
Можно, но я думаю, что это неразумно.Вы также должны быть осторожны при нажатии.Подумайте о том, чтобы немного изменить свои привычки и / или использовать @{upstream}
или что-то подобное в своих псевдонимах.
Long
Есть способ сделать то, что вы хотите, но он неуклюжий и негибкий.Вам нужно будет вручную сохранить файл .git/config
для этого конкретного репозитория, обновляя его каждый раз, когда набор имен веток, которые вы хотите переименовать, каким-либо образом изменяется.
Когда вы запускаете git fetch
(вы делаетеиспользуйте git fetch
, а не git pull
, я надеюсь :-) ... если вы используете git pull
, у вас будет больше проблем здесь), ваш Git использует URL-адрес, сохраненный под именем удаленного - origin
, вэтот случай - связаться с другим Git.У другого Git есть ветки, которые обычно называются master
и develop
и так далее, но у кого-то есть странное чувство имен и / или юмора, и он вместо этого использовал v1.2
.(Это гораздо больше подходит для имени tag , чем для имени ветви.)
В любом случае ваш git fetch
получает список ветвей из их Git и переносит любые коммиты, которые у них есть, которых у вас нет, используя необработанные хэш-идентификаторы коммитов для достижения этой цели.Коммиты приносят с собой любые необходимые файлы.Технически, Git просто передает объекты , включая коммит, дерево и blob объекты, чтобы получить все.В любом случае, теперь, когда у вас есть коммиты, у вас есть все, что вам нужно, кроме одной части: names .
Ваш git fetch
теперь переходит к rename все их названия филиалов.Это переименование контролируется другой настройкой под вашим удаленным именем:
$ cat .git/config
[snip]
[remote "origin"]
url = <some url>
fetch = +refs/heads/*:refs/remotes/origin/*
Параметр url
содержит URL, который мы уже упоминали.Именно эта строка fetch
определяет способ переименования их имен веток, хотя: этот конкретный (стандартный) параметр fetch
говорит вашему Git: соответствует чему-либо, начинающемуся с refs/heads/
, и переписывает его встрока, начинающаяся с refs/remotes/origin/
.Первая *
- это часть «сопоставить с чем угодно», а вторая говорит Git повторно вставить то, что было найдено.
Но вы не хотите менять refs/heads/master
на refs/remotes/origin/master
и refs/heads/v1.2
до refs/remotes/origin/v1.2
.В частности, вы хотите изменить refs/heads/v1.2
(как показано на их Git) на refs/remotes/origin/master
(чтобы хранить в вашем хранилище Git).К счастью, у вас нет , чтобы использовать *
для соответствия всем - вы можете перечислить каждое имя, по одному:
[remote "origin"]
url = <some url>
fetch = +refs/heads/v1.2:refs/remotes/origin/master
fetch = +refs/heads/mr_t:refs/remotes/origin/i_pity_the_fool
и так далее.Каждый из этих refspecs начинается со знака плюс - это устанавливает флаг "force", так что ваш Git будет перезаписывать вашу ссылку, используя их их новое значениедаже если это не операция перемотки вперед, а затем перечисляет их имя ветви, двоеточие, отделяющее их имя от вашего имени, а затем перечисляет ваше имя в вашем refs/remotes/origin/
имя-пространства.Поскольку вы не используете совпадение *
, вы должны список каждую ветку , которую хотите скопировать с них, и укажите уникальное имя на своей стороне.
Обратите внимание, что эти выборочные refspecs не влияют на операции push. Если вы намереваетесь что-то протолкнуть из вашего master
в их v1.2
, вам придется запустить git push origin master:v1.2
.Вы можете установить только одно upstream имя для каждой ветви;вам нужно будет использовать переименованное origin/master
имя, которое, конечно, не фактическое имя в origin
.Если push.default
настроен на simple
(как в Git 2.0 и более поздних версиях), если имя вашей ветви не совпадает с именем их ветви - а это не так - вам придется прописать все свои push-команды.