Jika ada repositori yang hanya dapat saya git://
akses (dan biasanya hanya dengan push + pull), apakah ada cara untuk mengubah nama cabang dalam repositori dengan cara yang sama dengan yang akan saya lakukan secara lokal git branch -m
?
407
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.Jawaban:
Anda hanya perlu membuat cabang lokal baru dengan nama yang diinginkan, dorong ke remote Anda, dan kemudian hapus cabang remote lama:
Kemudian, untuk melihat nama cabang yang lama, setiap klien dari repositori harus melakukan:
CATATAN: Jika cabang lama Anda adalah cabang utama Anda, Anda harus mengubah pengaturan cabang utama Anda. Jika tidak, saat Anda menjalankan
$ git push origin :old-branch-name
, Anda akan mendapatkan kesalahan "penghapusan cabang saat ini dilarang" .sumber
git fetch origin --prune
(untuk mengambil cabang baru secara efektif dan juga menyingkirkan referensi tidak lagi pada remote).-d
atau--delete
sebagai gantinya:
di versi git yang lebih baru.Jika Anda benar-benar hanya ingin mengubah nama cabang dari jarak jauh, tanpa mengubah nama cabang lokal secara bersamaan , Anda dapat melakukan ini dengan satu perintah:
Saya menulis skrip ini ( git-rename-remote-branch ) yang menyediakan pintasan praktis untuk melakukan hal di atas dengan mudah.
Sebagai fungsi bash:
Untuk mengintegrasikan komentar @ ksrb : Yang dilakukan pada dasarnya adalah dua dorongan dalam satu perintah, pertama yang
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
mendorong cabang jarak jauh baru berdasarkan cabang pelacakan jarak jauh yang lama dan kemudiangit push <remote> :<old_name>
menghapus cabang jarak jauh yang lama.sumber
git push <remote>/<old_name>:refs/heads/<new_name>
push berarti mendorong remote baru yang menggunakan remote lama sebagai src kemudiangit push [space]:<old_name>
berarti menghapus remote lamarefs/heads/name
? Tidak bisakah Andaname
langsung menggunakan , membuat perintah pertamagit push <remote> <remote>/<old_name>:<new_name>
?<new_name>
belum ada. Jika cabang tidak ada, Git mengharuskan Anda untuk menggunakan nama lengkap karena selain<new_name>
itu juga bisa merujuk ke nama tag.refs/heads/<new_name>
sudah ada. Penghapusan masih berhasil, sehingga<remote>/<old_name>
hanya dihapus. Beberapa pemeriksaan sebelum tangan dapat dengan mudah menghindari ini.Pertama checkout ke cabang yang ingin Anda rename:
Untuk menghapus cabang lama dari
remote
:sumber
git push -u origin new_branch
Jika tidak, cabang yang diganti nama (new_branch) akan terus melacak asal / old_branch. Dan setelah Anda menghapus old_branch jarak jauh, new_branch masih akan melacak asal / old_branch, meskipun sekarang cabang itu hilang.Tentu. Cukup ganti nama cabang secara lokal, dorong cabang baru, dan dorong penghapusan yang lama.
Satu-satunya masalah sebenarnya adalah pengguna repositori lain tidak akan mengganti nama cabang pelacakan lokal.
sumber
TL; DR
"Mengganti nama" cabang jarak jauh sebenarnya adalah proses 2 langkah (tidak harus dipesan):
git push [space]:<old_name>
seperti yang dijelaskan ksrb );Menghapus
Saya menggunakan TortoiseGit dan ketika saya pertama kali mencoba menghapus cabang melalui baris perintah, saya mendapatkan ini:
Ini kemungkinan karena kontes tidak memiliki kunci pribadi dimuat (yang memuat TortoiseGit secara otomatis ke dalam kontes ). Selain itu, saya perhatikan bahwa perintah TortoiseGit tidak memiliki
origin
referensi di dalamnya (misalnyagit.exe push --progress "my_project" interesting_local:interesting
).Saya juga menggunakan Bitbucket dan, seperti yang lain seperti manajer git online berbasis web (GitHub, GitLab), saya dapat menghapus cabang jarak jauh secara langsung melalui antarmuka mereka (halaman cabang):
Namun, di TortoiseGit Anda juga dapat menghapus cabang jarak jauh melalui Browse Referensi :
Dengan mengklik kanan pada cabang jarak jauh (daftar remote), opsi Hapus cabang jauh muncul:
Mendorong
Setelah menghapus cabang jarak jauh lama saya mendorong langsung ke cabang jarak jauh baru melalui TortoiseGit hanya dengan mengetikkan nama baru di bidang Remote: pada jendela Push dan cabang ini secara otomatis dibuat dan terlihat di Bitbucket .
Namun, jika Anda masih lebih suka melakukannya secara manual, titik yang belum disebutkan di utas ini adalah itu
-u
=--set-upstream
.Dari
git push
docs ,-u
hanya alias--set-upstream
, jadi perintah dalam jawaban Sylvain (-set-upstream new-branch
) dan Shashank (-u origin new_branch
) adalah setara, karena remote ref default keorigin
jika tidak ada ref lain yang sebelumnya didefinisikan:git push origin -u new_branch
=git push -u new_branch
dari deskripsi dokumen :Pada akhirnya, saya tidak mengetik secara manual atau menggunakan salah satu perintah yang disarankan oleh jawaban lain di sini, jadi mungkin ini mungkin berguna bagi orang lain dalam situasi yang sama.
sumber
origin
. Anda harus memberi nama remote Anda saat mendapatkannya dari menjalankan perintahgit remote
. Git bekerja denganssh
apa yang menyiratkan bahwa Anda menggunakan kunci publik + pribadi. Saya berasumsi bahwaAutoload Putty keys
TortoiseGit hanya mengunci secara otomatis kunci yang diperlukan agar Anda dapat melakukan apa saja dengan referensi jarak jauh Anda. Hal terakhir adalah itugit push -u
bukan alias untuk mendorong ke cabang jauh, itu adalah alias untuk mendorong ke cabang jauh yang dibuat secara lokal dan referensi jarak jauh belum cabang ini .-u
adalah alias--set-upstream
dan "jika konfigurasi tidak ada, defaultnya adalahorigin
". Sylvain dan Shashank menggunakan ini untuk mendorong ke cabang terpencil yang baru dibuat . Masalah utama mungkin karena kontes tidak memuatnya ketika saya mencobagit push origin :in
di shell. Jadi saya tidak mengerti downvote Anda, saya hanya menunjukkan detail saya dan tidak ditanggapi dalam jawaban lain, menjelaskannya dan menyelesaikannya.-u
adalah alias untuk--set-upstream
tetapi itu bukan alias untuk mendorong ke cabang jauh seperti yang Anda katakan. Untuk mendorong ke cabang jarak jauh yang Anda butuhkan secara unikgit push <remote>
, dan jika belum ada di remote, Anda menambahkangit push -u <remote>
. Karena itu,-u
digunakan untuk membuat referensi cabang di remote.Saya tidak tahu mengapa tetapi jawaban @Sylvain Defresne tidak bekerja untuk saya.
Saya harus mengatur hulu dan kemudian saya dapat mengatur aliran lagi. Berikut ini adalah bagaimana saya melakukannya.
sumber
Saya tidak tahu apakah ini benar atau salah, tetapi saya mendorong "nama lama" cabang ke "nama baru" cabang, lalu menghapus cabang lama seluruhnya dengan dua baris berikut:
sumber
Anda dapat membuat cabang baru berdasarkan cabang nama lama. Sama seperti ini, lalu hapus cabang lama, lebih dari !!!
sumber
Menambah jawaban yang sudah diberikan, berikut adalah versi yang pertama memeriksa apakah cabang baru sudah ada (sehingga Anda dapat menggunakannya dengan aman dalam skrip)
(cek berasal dari jawaban ini )
sumber
git show-ref --quiet --verify -- refs/heads/$new_name
sebagai gantinyals-remote | cut | sed | grep
.