Псевдоним удаленного филиала локально - PullRequest
0 голосов
/ 30 мая 2018

Я работаю с репо, у которого нет ветки master, но есть несколько ветвей vX.Y.Я всегда буду использовать, скажем, v1.2 в качестве моей удаленной ветви.Я привык называть удаленную ветку master и иметь много псевдонимов для таких вещей, как:

alias grhm="git reset --hard origin/master"

, и я хотел бы оставить их без изменений, так как это происходит

Есть ли способ обозначить ветку origin/v1.2 как origin/master?Может ли это быть достигнуто с помощью какой-либо записи в файле .git/config или чего-то в этом роде, чтобы я мог продолжать работать и с другими репозиториями в той же среде оболочки?

1 Ответ

0 голосов
/ 30 мая 2018

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-команды.

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