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]}?
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" .
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.
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
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):
No entanto, em TortoiseGit também pode apagar os ramos remotos através das referências de navegação :
Ao carregar com o botão direito num comando ramo( lista de comandos) a opção apagar ramo remoto aparece: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.
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
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
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)