git: mudar o nome dos ramos remotamente?

Se existe um repositório que eu só tenho git:/ / access to( e que normalmente apenas iria empurrar+pull), existe uma maneira de mudar o nome de branches nesse repositório da mesma forma que eu faria localmente com {[[0]}?

Author: kdt, 2011-01-21

9 answers

Só tem de criar um novo ramo local com o nome desejado, empurrá - lo para o seu remoto, e depois apagar o antigo ramo remoto:

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

Então, para ver o antigo nome do ramo, cada cliente do repositório teria que fazer:

$ git fetch origin
$ git remote prune origin

Nota: Se a sua ramificação antiga for a sua ramificação principal, deverá alterar a configuração da ramificação principal. Caso contrário, quando executar $ git push origin :old-branch-name, obterá o erro "remoção do ramo actual proibido" .

 421
Author: Sylvain Defresne, 2017-05-23 12:34:53

Se realmente quiser mudar o nome dos ramos remotamente, sem mudar o nome de quaisquer ramos locais ao mesmo tempo, pode fazer isto com um único comando:

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

Eu escrevi este programa ( git-mudar o nome-ramificação remota ) que oferece um atalho útil para fazer o acima facilmente.

para integrar o comentário do @ksrb: o que isto basicamente faz é dois empurrões num único comando, primeiro git push <remote> <remote>/<old_name>:refs/heads/<new_name> para empurrar um novo ramo remoto baseado no antigo ramo de localização remota e então git push <remote> :<old_name> para apagar o antigo ramo remoto.

 240
Author: sschuberth, 2017-11-10 15:25:09

Primeira saída para o ramo que deseja mudar o nome

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

Para remover o ramo antigo do remoto:

git push origin :old_branch
 145
Author: Shashank Hegde, 2016-09-15 18:50:34
Claro. Basta mudar o nome do ramo localmente, em seguida, empurrar o novo ramo e empurrar uma exclusão do antigo. O único problema real é que outros usuários do repo não terão filiais de rastreamento locais renomeados.
 10
Author: Kevin Ballard, 2011-01-20 23:33:48

TL; DR

"mudar o nome" de um ramo remoto é na verdade um processo de 2 passos (não necessariamente ordenado):

  • eliminação do ramo remoto antigo (git push [space]:<old_name> Como o ksrb explicou);
  • empurre para um novo ramo remoto (diferença entre um par de comandos Respostas abaixo).

Apagar

Eu uso TortoiseGit e quando tentei pela primeira vez apagar o ramo através da linha de comando, consegui isto:

$ git push origin :in
  • Fatal: 'origin' não parece ser um repositório git

  • Fatal: não foi possível ler do repositório remoto.

Certifique-se que tem os direitos de acesso correctos e que o repositório existe.

Esta foi, provavelmente, devido ao concurso não ter o chave privada carregado (que TortoiseGit carrega automaticamente em concurso). Além disso, eu notei que TortoiseGit comandos não tenha o origin ref neles (por exemplo git.exe push --progress "my_project" interesting_local:interesting).

Também estou a usar Bitbucket e, como outros gestores de git online baseados na web do tipo (GitHub, GitLab), consegui apagar o ramo remoto directamente através da sua interface (branches page):

Delete branch Bitbucket

No entanto, em TortoiseGit também pode apagar os ramos remotos através das referências de navegação :

Browse References menu

Ao carregar com o botão direito num comando ramo( lista de comandos) a opção apagar ramo remoto aparece:

TortoiseGit remote branch delete

Empurrar

Depois de eliminar o velho ramo remoto puxei diretamente em um novo ramo remoto através TortoiseGit apenas digitando o novo nome na caixa de Remoto: campo de Push janela e este ramo foi automaticamente criado e visível em Bitbucket.

No entanto, se ainda preferir fazê-lo manualmente, um ponto isso ainda não foi mencionado neste tópico é que -u = --set-upstream.

De git push docs, -u é apenas um alias de --set-upstream, então os comandos nas respostas dos Sylvain (-set-upstream new-branch) e Shashank (-u origin new_branch) são equivalentes, desde o remoto ref padrão origin se nenhum outro ref anteriormente foi definido:

  • git push origin -u new_branch = git push -u new_branch da descrição dos documentos :

    Se a configuração faltar, é por omissão origin.

No final, eu não digitei manualmente ou usei qualquer um dos comandos sugeridos pelas outras respostas aqui, então talvez isso possa ser útil para outros em uma situação semelhante.

 2
Author: CPHPython, 2018-03-23 17:06:00
Não sei porquê, mas a resposta de @Sylvain Defresne não funciona para mim.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Tenho de desligar o rio e depois posso voltar a pôr o riacho. Foi assim que o fiz.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
 1
Author: arthur bryant, 2018-04-13 01:47:06

Eu não sei se isto é certo ou errado, mas eu empurrei o "nome antigo" do ramo para o "novo nome" do ramo, em seguida, apagou o ramo antigo inteiramente com as seguintes duas linhas:

git push origin old_branch:new_branch
git push origin :old_branch
 0
Author: EpicPandaForce, 2017-05-03 11:43:14

Pode criar um novo ramo com base no ramo antigo. Assim mesmo, depois apaga o ramo antigo, escuto!!! enter image description here

 -2
Author: Pober Wong, 2018-04-10 11:32:19

Adicionando às respostas já dadas, aqui está uma versão que primeiro verifica se o novo ramo já existe (para que o possa usar com segurança num programa)

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"

(a verificação é de esta resposta)

 -3
Author: myzzzl, 2017-06-09 17:38:35