Se houver um repositório ao qual eu tenha git://
acesso apenas (e normalmente apenas pressione + puxe), existe uma maneira de renomear ramificações nesse repositório da mesma maneira que faria localmente git branch -m
?
Se houver um repositório ao qual eu tenha git://
acesso apenas (e normalmente apenas pressione + puxe), existe uma maneira de renomear ramificações nesse repositório da mesma maneira que faria localmente git branch -m
?
Respostas:
Você só precisa criar uma nova ramificação local com o nome desejado, enviá-la para o controle remoto e excluir a ramificação remota antiga:
$ 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 da filial, cada cliente do repositório teria que fazer:
$ git fetch origin
$ git remote prune origin
NOTA: Se o seu ramo antigo é o ramo principal, você deve alterar as configurações principais do ramo. Caso contrário, ao executar $ git push origin :old-branch-name
, você receberá o erro "exclusão da ramificação atual proibida" .
git fetch origin --prune
(para buscar efetivamente as novas ramificações e também se livrar das referências que não estão mais no controle remoto).
-d
ou em --delete
vez de :
nas versões mais recentes do git.
Se você realmente deseja renomear ramificações remotamente, sem renomear nenhuma ramificação local ao mesmo tempo , faça isso com um único comando:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Eu escrevi este script ( git-rename-remote-branch ) que fornece um atalho útil para fazer o que foi dito facilmente.
Como uma função bash:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
Para integrar o comentário do @ ksrb : O que isso basicamente faz são dois toques em um único comando, primeiro git push <remote> <remote>/<old_name>:refs/heads/<new_name>
para enviar uma nova ramificação remota com base na ramificação de rastreamento remoto antiga e depois git push <remote> :<old_name>
excluir a ramificação remota antiga.
git push <remote>/<old_name>:refs/heads/<new_name>
git push [space]:<old_name>
refs/heads/name
? Você não pode simplesmente usar name
diretamente, fazendo o primeiro comando git push <remote> <remote>/<old_name>:<new_name>
?
<new_name>
ainda não existe. Se a ramificação não existir, o Git exigirá que você use o nome completo, caso contrário, <new_name>
também poderá se referir a um nome de tag.
refs/heads/<new_name>
já existe. A exclusão ainda é bem-sucedida, resultando <remote>/<old_name>
apenas na exclusão. Algumas verificações antes da mão podem facilmente evitar isso.
Primeiro faça o checkout no ramo que você deseja renomear:
git branch -m old_branch new_branch
git push -u origin new_branch
Para remover uma ramificação antiga de remote
:
git push origin :old_branch
git push -u origin new_branch
), caso contrário, o ramo renomeado (new_branch) continuará a rastrear o origin / old_branch. E depois que você excluir o old_branch remoto, o new_branch ainda rastreará a origem / old_branch, embora agora que a ramificação se foi.
Certo. Apenas renomeie a ramificação localmente, envie a nova ramificação e exclua a antiga.
O único problema real é que outros usuários do repositório não terão as ramificações de rastreamento local renomeadas.
"Renomear" uma ramificação remota é na verdade um processo de duas etapas (não necessariamente solicitado):
git push [space]:<old_name>
como o ksrb explicou );Eu uso o TortoiseGit e quando tentei excluir o ramo pela linha de comando, obtive o seguinte:
$ 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.
Verifique se você possui os direitos de acesso corretos e se o repositório existe.
Isso provavelmente ocorreu devido ao concurso não ter a chave privada carregada (que o TortoiseGit carrega automaticamente no concurso ). Além disso, notei que os comandos do TortoiseGit não possuem a origin
referência neles (por exemplo git.exe push --progress "my_project" interesting_local:interesting
).
Também estou usando o Bitbucket e, como outros gerenciadores de git on-line baseados na Web (GitHub, GitLab), pude excluir a ramificação remota diretamente através de sua interface (página de ramificações):
No entanto, no TortoiseGit, você também pode excluir ramificações remotas através de Browse References :
Ao clicar com o botão direito do mouse em uma ramificação remota (lista de controles remotos), a opção Excluir ramificação remota é exibida:
Após excluir a ramificação remota antiga, enviei diretamente para uma nova ramificação remota através do TortoiseGit, apenas digitando o novo nome no campo Remote: da janela Push e essa ramificação foi criada e visível automaticamente no Bitbucket .
No entanto, se você ainda preferir fazê-lo manualmente, um ponto que ainda não foi mencionado neste segmento é que -u
= --set-upstream
.
Nos git push
documentos , -u
é apenas um alias de --set-upstream
, portanto, os comandos nas respostas de Sylvain ( -set-upstream new-branch
) e Shashank ( -u origin new_branch
) são equivalentes, já que a referência remota é padronizada comoorigin
se nenhuma outra referência foi definida anteriormente:
git push origin -u new_branch
= git push -u new_branch
da descrição do documento :
Se a configuração estiver ausente, o padrão será
origin
.
No final, eu não digitei manualmente ou usei nenhum dos comandos sugeridos pelas outras respostas aqui, então talvez isso possa ser útil para outras pessoas em uma situação semelhante.
origin
. Você precisa nomear o seu controle remoto ao executá-lo git remote
. O Git funciona com o ssh
que implica que você está usando chaves públicas + privadas. Eu assumo que oAutoload Putty keys
TortoiseGit esteja apenas carregando automaticamente as chaves necessárias para que você faça qualquer coisa com sua referência remota. A última coisa é que git push -u
não é um alias para enviar para uma ramificação remota, é um alias para enviar para uma ramificação remota que foi criada localmente e sua referência remota ainda não tem essa ramificação .
-u
é um pseudônimo de --set-upstream
"se a configuração estiver ausente, o padrão seráorigin
". Sylvain e Shashank usam isso para enviar para um ramo remoto recém-criado . O principal problema pode ter sido devido ao concurso não ter carregado quando tentei git push origin :in
no shell. Portanto, não entendo seu voto negativo, apenas apontei os meus e os detalhes não endereçados em outras respostas, expliquei-os e resolvi-os.
-u
é um apelido para, --set-upstream
mas não um apelido para enviar para um ramo remoto, como você disse. Para entrar em uma ramificação remota, você precisa exclusivamente git push <remote>
e, se ainda não estiver na remota, adicione git push -u <remote>
. Portanto, -u
é usado para criar uma referência da ramificação no controle remoto.
Não sei por que, 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
Eu tenho que desconfigurar o upstream e então posso definir o stream novamente. A seguir, é como eu fiz isso.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
Não sei se isso está certo ou errado, mas coloquei o "nome antigo" do ramo no "novo nome" do ramo e excluí o ramo antigo inteiramente com as duas linhas a seguir:
git push origin old_branch:new_branch
git push origin :old_branch
Você pode criar uma nova ramificação com base na ramificação de nome antigo. Assim, exclua a ramificação antiga !!!
Além das respostas já fornecidas, aqui está uma versão que primeiro verifica se o novo ramo já existe (para que você possa usá-lo com segurança em um script)
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 é desta resposta )
git show-ref --quiet --verify -- refs/heads/$new_name
vez de ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.