Se esiste un repository a cui ho git://
accesso (e di solito spingerebbe + pull), c'è un modo per rinominare i rami in quel repository nello stesso modo in cui farei localmente git branch -m
?
Se esiste un repository a cui ho git://
accesso (e di solito spingerebbe + pull), c'è un modo per rinominare i rami in quel repository nello stesso modo in cui farei localmente git branch -m
?
Risposte:
Devi solo creare un nuovo ramo locale con il nome desiderato, inviarlo al tuo telecomando, quindi eliminare il vecchio 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
Quindi, per vedere il vecchio nome del ramo, ogni client del repository dovrebbe fare:
$ git fetch origin
$ git remote prune origin
NOTA: se il vecchio ramo è il ramo principale, è necessario modificare le impostazioni del ramo principale. Altrimenti, quando si esegue $ git push origin :old-branch-name
, verrà visualizzato l'errore "eliminazione del ramo corrente vietata" .
git fetch origin --prune
(per recuperare in modo efficace i nuovi rami e anche eliminare i riferimenti non più sul telecomando).
-d
o --delete
invece che :
nelle versioni più recenti di git.
Se vuoi davvero solo rinominare i rami da remoto, senza rinominare i rami locali contemporaneamente , puoi farlo con un solo comando:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Ho scritto questo script ( git-rename-remote-branch ) che fornisce un pratico collegamento per fare facilmente quanto sopra.
Come una funzione 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
}
Per integrare il commento di @ ksrb : Ciò che sostanzialmente fa è due push in un singolo comando, prima git push <remote> <remote>/<old_name>:refs/heads/<new_name>
di inviare un nuovo ramo remoto basato sul vecchio ramo di tracciamento remoto e poi git push <remote> :<old_name>
di eliminare il vecchio ramo remoto.
git push <remote>/<old_name>:refs/heads/<new_name>
significa spingere un nuovo telecomando che utilizza il vecchio telecomando come src, quindi git push [space]:<old_name>
eliminare il vecchio telecomando
refs/heads/name
? Non puoi semplicemente usare name
direttamente, facendo il primo comando git push <remote> <remote>/<old_name>:<new_name>
?
<new_name>
non esiste ancora. Se il ramo non esiste, Git richiede di utilizzare il nome completo, altrimenti <new_name>
potrebbe fare riferimento anche al nome di un tag.
refs/heads/<new_name>
esiste già. L'eliminazione ha ancora esito positivo, con conseguente eliminazione <remote>/<old_name>
. Alcuni controlli prima mano possono facilmente evitarlo.
Primo controllo alla filiale che si desidera rinominare:
git branch -m old_branch new_branch
git push -u origin new_branch
Per rimuovere un vecchio ramo da remote
:
git push origin :old_branch
git push -u origin new_branch
), Altrimenti il ramo rinominato (new_branch) continuerà a tenere traccia dell'origine / old_branch. E dopo aver eliminato old_branch remoto, new_branch seguirà comunque l'origine / old_branch, anche se ora quel ramo non c'è più.
Sicuro. Basta rinominare il ramo localmente, spingere il nuovo ramo e spingere una cancellazione del vecchio.
L'unico vero problema è che agli altri utenti del repository non verranno rinominati i rami di tracciamento locali.
"Rinominare" un ramo remoto è in realtà un processo in 2 fasi (non necessariamente ordinato):
git push [space]:<old_name>
come spiegato da ksrb );Uso TortoiseGit e quando ho provato per la prima volta a eliminare il ramo dalla riga di comando, ho ottenuto questo:
$ git push origin :in
fatale: 'origine' non sembra essere un repository git
fatale: impossibile leggere dal repository remoto.
Assicurarsi di disporre dei diritti di accesso corretti e che il repository sia presente.
Ciò era probabilmente dovuto al fatto che il concorso non aveva la chiave privata caricata (che TortoiseGit carica automaticamente nel concorso ). Inoltre, ho notato che i comandi TortoiseGit non hanno il riferimento origin
(es git.exe push --progress "my_project" interesting_local:interesting
.).
Sto anche usando Bitbucket e, come altri gestori di git online del genere (GitHub, GitLab), sono stato in grado di eliminare il ramo remoto direttamente attraverso la loro interfaccia (pagina rami):
Tuttavia, in TortoiseGit è anche possibile eliminare i rami remoti tramite Sfoglia riferimenti :
Facendo clic con il pulsante destro del mouse su un ramo remoto (elenco telecomandi) viene visualizzata l' opzione Elimina ramo remoto :
Dopo aver eliminato il vecchio ramo remoto, ho inserito direttamente un nuovo ramo remoto tramite TortoiseGit semplicemente digitando il nuovo nome nel campo Remoto: della finestra Push e questo ramo è stato creato e visibile automaticamente in Bitbucket .
Tuttavia, se preferisci ancora farlo manualmente, un punto che non è stato ancora menzionato in questa discussione è che -u
= --set-upstream
.
Dai git push
documenti , -u
è solo un alias di --set-upstream
, quindi i comandi nelle risposte di Sylvain ( -set-upstream new-branch
) e Shashank ( -u origin new_branch
) sono equivalenti, dal momento che il riferimento remoto è predefinitoorigin
se nessun altro riferimento è stato precedentemente definito:
git push origin -u new_branch
= git push -u new_branch
dalla descrizione dei documenti :
Se manca la configurazione, per impostazione predefinita è
origin
.
Alla fine, non ho inserito manualmente o usato nessuno dei comandi suggeriti dalle altre risposte qui, quindi forse questo potrebbe essere utile ad altri in una situazione simile.
origin
. Devi nominare il tuo telecomando mentre lo ottieni dall'esecuzione del comando git remote
. Git funziona con ssh
ciò che implica che stai usando le chiavi pubbliche + private. Presumo che Autoload Putty keys
TortoiseGit stia semplicemente caricando automaticamente le chiavi necessarie affinché tu possa fare qualsiasi cosa con il tuo riferimento remoto. L'ultima cosa è che git push -u
non è un alias per l'invio in un ramo remoto, è un alias per l'inserimento in un ramo remoto creato localmente e il suo riferimento remoto non ha ancora questo ramo .
-u
è un alias di --set-upstream
e "se manca la configurazione, il valore predefinito èorigin
". Sylvain e Shashank lo usano per spingere in un ramo remoto appena creato . Il problema chiave potrebbe essere stato dovuto al fatto che il concorso non lo ha caricato quando ho provato git push origin :in
sulla shell. Quindi non capisco il tuo voto negativo, ho appena indicato il mio e i dettagli non affrontati in altre risposte, li ho spiegati e risolti.
-u
è un alias per --set-upstream
ma non è un alias per spingere in un ramo remoto come hai detto. Per inserire un ramo remoto è necessario in modo univoco git push <remote>
e se non si trova ancora nel telecomando, è necessario aggiungere git push -u <remote>
. Pertanto, -u
viene utilizzato per creare un riferimento al ramo nel telecomando.
Non so perché ma la risposta di @Sylvain Defresne non funziona per me.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Devo disinserire l'upstream e quindi posso impostare nuovamente il flusso. Quanto segue è come l'ho fatto.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
Non so se questo è giusto o sbagliato, ma ho spinto il "vecchio nome" del ramo sul "nuovo nome" del ramo, quindi ho eliminato completamente il vecchio ramo con le seguenti due righe:
git push origin old_branch:new_branch
git push origin :old_branch
È possibile creare un nuovo ramo basato sul ramo vecchio nome. Proprio così, quindi elimina il vecchio ramo, oltre !!!
Aggiungendo alle risposte già fornite, ecco una versione che controlla prima se il nuovo ramo esiste già (quindi puoi tranquillamente usarlo in uno 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"
(il controllo è da questa risposta )
git show-ref --quiet --verify -- refs/heads/$new_name
posto di ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.