Переименование веток удаленно в Git - PullRequest
371 голосов
/ 21 января 2011

Если есть репозиторий, к которому у меня есть только git:// доступ (и обычно это просто push + pull), есть ли способ переименовать ветки в этом репозитории так же, как я делал бы локально с git branch -m

Ответы [ 9 ]

455 голосов
/ 21 января 2011

Вам просто нужно создать новую локальную ветку с нужным именем, отправить ее на удаленный компьютер и удалить старую удаленную ветку:

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

Затем, чтобы увидеть старое имя ветки, каждый клиент репозитория должен будет сделать:

$ git fetch origin
$ git remote prune origin

ПРИМЕЧАНИЕ. Если ваша старая ветка является вашей основной веткой, вам следует изменить настройки основной ветки. В противном случае при запуске $ git push origin :old-branch-name вы получите ошибку «удаление текущей ветки запрещено» .

268 голосов
/ 23 января 2014

Если вы действительно просто хотите переименовать ветки удаленно, без переименования каких-либо локальных веток одновременно , вы можете сделать это с помощью одной команды:

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

Я написал этот скрипт ( git-rename-remote-branch ), который предоставляет удобный ярлык для простого выполнения вышеперечисленных действий.

Чтобы интегрировать комментарий @ ksrb : это в основном делает два нажатия одной командой, сначала git push <remote> <remote>/<old_name>:refs/heads/<new_name>, чтобы протолкнуть новую удаленную ветвь на основе старой удаленной ветви отслеживания, а затем git push <remote> :<old_name> в удалить старую удаленную ветку.

158 голосов
/ 23 января 2014

Первая проверка в филиале, который вы хотите переименовать:

git branch -m old_branch new_branch
git push -u origin new_branch

Чтобы удалить старую ветку из remote:

git push origin :old_branch
10 голосов
/ 21 января 2011

Конечно. Просто переименуйте ветку локально, нажмите новую ветку и удалите старую.

Единственная реальная проблема заключается в том, что другие пользователи хранилища не будут переименовывать локальные ветви отслеживания.

2 голосов
/ 12 января 2018

TL; DR

«Переименование» удаленной ветви на самом деле представляет собой двухэтапный процесс (не обязательно заказывается):

  • удаление старой удаленной ветви (git push [space]:<old_name>, как объяснено ksrb );
  • нажмите на новую удаленную ветку (разница между командами ответов на пару ниже).

Удаление

Я использую TortoiseGit , и когда я впервые попытался удалить ветку через командную строку, я получил это:

$ git push origin :in
  • роковым: «origin» не является git-репозиторием

  • неустранимо: не удалось прочитать из удаленного хранилища.

Пожалуйста, убедитесь, что у вас есть правильные права доступа, и хранилище существует.

Вероятно, это связано с тем, что pageant не имеет загруженного закрытого ключа (который TortoiseGit автоматически загружается в pageant ). Более того, я заметил, что в командах TortoiseGit нет ссылки origin (например, git.exe push --progress "my_project" interesting_local:interesting).

Я также использую Bitbucket и, как и другие подобные онлайн-менеджеры Git (GitHub, GitLab), я смог удалить удаленную ветку напрямую через их интерфейс (страница ветвей):

Delete branch Bitbucket

Однако в TortoiseGit вы также можете удалять удаленные ветви с помощью Просмотр ссылок :

Browse References menu

Если щелкнуть правой кнопкой мыши по удаленной ветви (список удаленных), появится опция Удалить удаленную ветку :

TortoiseGit remote branch delete

Нажатие

После удаления старой удаленной ветви я вставил прямо в новую удаленную ветку с помощью TortoiseGit , просто введя новое имя в поле Remote: поля Push окно и эта ветка была автоматически создана и видна в Bitbucket .

Однако, если вы все еще предпочитаете делать это вручную, то, что еще не было упомянуто в этой теме: -u = --set-upstream.

С git push документы , -u это просто псевдоним --set-upstream, поэтому команды в ответах Сильвен (-set-upstream new-branch) и Shashank (-u origin new_branch) эквивалентны, так как удаленный ref по умолчанию равен origin, если ранее не было задано никакого другого ref:

  • git push origin -u new_branch = git push -u new_branch из описания документов :

    Если конфигурация отсутствует, по умолчанию используется origin.

В конце концов, я не вводил вручную и не использовал ни одну из команд, предложенных другими ответами здесь, так что, возможно, это может быть полезно для других в аналогичной ситуации.

1 голос
/ 13 апреля 2018

Не знаю почему, но ответ @Sylvain Defresne мне не подходит.

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

Я должен сбросить восходящий поток, а затем снова установить поток. Вот как я это сделал.

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
0 голосов
/ 10 апреля 2018

Вы можете создать новую ветку на основе ветки со старым именем.Так же, как это, затем удалите старую ветку, снова !!!enter image description here

0 голосов
/ 09 июня 2017

В дополнение к уже приведенным ответам, вот версия, которая сначала проверяет, существует ли новая ветвь (так что вы можете безопасно использовать ее в скрипте)

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(проверка от этот ответ )

0 голосов
/ 03 мая 2017

Я не знаю, правильно это или нет, но я поместил «старое имя» ветви в «новое имя» ветви, затем полностью удалил старую ветку следующими двумя строками:*

git push origin old_branch:new_branch
git push origin :old_branch
...