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
?
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
?
Jawaban:
Anda hanya perlu membuat cabang lokal baru dengan nama yang diinginkan, dorong ke remote Anda, dan kemudian hapus cabang remote lama:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Kemudian, untuk melihat nama cabang yang lama, setiap klien dari repositori harus melakukan:
$ git fetch origin
$ git remote prune origin
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" .
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:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Saya menulis skrip ini ( git-rename-remote-branch ) yang menyediakan pintasan praktis untuk melakukan hal di atas dengan mudah.
Sebagai fungsi 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
}
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 kemudian git push <remote> :<old_name>
menghapus cabang jarak jauh yang lama.
git push <remote>/<old_name>:refs/heads/<new_name>
push berarti mendorong remote baru yang menggunakan remote lama sebagai src kemudian git push [space]:<old_name>
berarti menghapus remote lama
refs/heads/name
? Tidak bisakah Anda name
langsung menggunakan , membuat perintah pertama git 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:
git branch -m old_branch new_branch
git push -u origin new_branch
Untuk menghapus cabang lama dari remote
:
git push origin :old_branch
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.
"Mengganti nama" cabang jarak jauh sebenarnya adalah proses 2 langkah (tidak harus dipesan):
git push [space]:<old_name>
seperti yang dijelaskan ksrb );Saya menggunakan TortoiseGit dan ketika saya pertama kali mencoba menghapus cabang melalui baris perintah, saya mendapatkan ini:
$ git push origin :in
fatal: 'origin' sepertinya bukan repositori git
fatal: Tidak bisa membaca dari repositori jarak jauh.
Pastikan Anda memiliki hak akses yang benar dan repositori ada.
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 (misalnya git.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:
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 :
Jika konfigurasi tidak ada, defaultnya adalah
origin
.
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.
origin
. Anda harus memberi nama remote Anda saat mendapatkannya dari menjalankan perintah git remote
. Git bekerja dengan ssh
apa yang menyiratkan bahwa Anda menggunakan kunci publik + pribadi. Saya berasumsi bahwa Autoload Putty keys
TortoiseGit hanya mengunci secara otomatis kunci yang diperlukan agar Anda dapat melakukan apa saja dengan referensi jarak jauh Anda. Hal terakhir adalah itu git 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 mencoba git 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 unik git push <remote>
, dan jika belum ada di remote, Anda menambahkan git 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.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Saya harus mengatur hulu dan kemudian saya dapat mengatur aliran lagi. Berikut ini adalah bagaimana saya melakukannya.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
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:
git push origin old_branch:new_branch
git push origin :old_branch
Anda dapat membuat cabang baru berdasarkan cabang nama lama. Sama seperti ini, lalu hapus cabang lama, lebih dari !!!
Menambah jawaban yang sudah diberikan, berikut adalah versi yang pertama memeriksa apakah cabang baru sudah ada (sehingga Anda dapat menggunakannya dengan aman dalam skrip)
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"
(cek berasal dari jawaban ini )
git show-ref --quiet --verify -- refs/heads/$new_name
sebagai gantinya ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.