Saya bekerja dari dua komputer yang berbeda (A dan B) dan menyimpan remote git yang umum di direktori dropbox.
Katakanlah saya memiliki dua cabang, master dan devel. Keduanya melacak rekan jarak jauh mereka asal / master dan asal / devel.
Sekarang saat di komputer A, saya menghapus devel cabang, di lokal dan jarak jauh.
git push origin :heads/devel
git branch -d devel
Berjalan git branch -a
di komputer A, saya mendapatkan daftar cabang berikut.
- menguasai
- asal / KEPALA
- asal / master
Berjalan git fetch
di komputer B, saya bisa menghapus cabang devel lokal dengan git branch -d devel
, tapi saya tidak bisa menghapus cabang devel jarak jauh.
git push origin :heads/devel
mengembalikan pesan kesalahan berikut.
galat: tidak dapat mendorong ke tujuan yang tidak memenuhi syarat: kepala / proxy3d
Tujuan refspec tidak cocok dengan referensi yang ada pada remote atau dimulai dengan referensi /, dan kami tidak dapat menebak awalan berdasarkan referensi sumber.
fatal: Ujung yang jauh menutup secara tak terduga
git branch -a
masih daftar asal / berkembang di cabang jauh.
Bagaimana saya bisa membersihkan cabang jarak jauh dari komputer B?
sumber
Jawaban:
Pertama, apa hasil dari
git branch -a
pada mesin B?Kedua, Anda telah dihapus
heads/devel
padaorigin
, sehingga ini mengapa Anda tidak dapat menghapusnya dari mesin B.Mencoba
atau
atau
dan jangan ragu untuk menambahkan
--dry-run
di akhirgit
pernyataan Anda untuk melihat hasil menjalankannya tanpa benar-benar menjalankannya.Documents untuk
git remote prune
dangit branch
.sumber
git remote prune origin
bekerja untuk saya =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
menunjukkan kepada Anda apa yang akan dihapus tanpa benar-benar melakukannya.git fetch origin --prune
sempurna untuk menghapus cabang yang dihapusgit branch -vv
diikuti olehgit branch -D branchname
dan akhirnya pangkas adalah cara terbaik.git config remote.origin.prune true
Pertimbangkan untuk menjalankan:
Secara teratur di setiap repo untuk menghapus cabang lokal yang telah melacak cabang jauh yang dihapus (tidak lagi ada di repo GIT jarak jauh).
Ini dapat disederhanakan dengan
ini adalah
per-repo
pengaturan yang akan membuat masa depan apa pun dipangkasgit fetch or git pull
secara otomatis .Untuk mengatur ini untuk pengguna Anda, Anda juga dapat mengedit .gitconfig global dan menambahkan
Namun, disarankan agar ini dilakukan menggunakan perintah berikut:
atau untuk menerapkannya secara luas (tidak hanya untuk pengguna)
sumber
Berikut ini skrip bash yang dapat melakukannya untuk Anda. Ini versi modifikasi dari http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git script. Modifikasi saya memungkinkannya untuk mendukung lokasi terpencil yang berbeda.
sumber
sed
s. Gantised 's/\(.*\)\/\(.*\)/\1/g'
olehsed 's/\([^/]*\)\/\(.*\)/\1/g'
Perintah ini akan "dry run" menghapus semua
origin
cabang yang jauh ( ) digabung, selainmaster
. Anda bisa mengubahnya, atau, tambahkan cabang tambahan setelah master:grep -v for-example-your-branch-here |
Jika terlihat bagus, hapus
--dry-run
. Selain itu, Anda mungkin ingin menguji ini menggunakan garpu terlebih dahulu.sumber
Jika
git branch -r
menunjukkan banyak cabang pelacakan jarak jauh yang tidak Anda minati dan Anda ingin menghapusnya hanya dari lokal, gunakan perintah berikut:Versi yang lebih aman hanya dengan menghapus yang digabungkan:
Ini mungkin berguna untuk proyek-proyek besar, di mana Anda tidak memerlukan cabang fitur dari rekan tim lain tetapi ada banyak cabang pelacakan jarak jauh diambil pada klon awal.
Namun, langkah ini saja tidak cukup, karena cabang-cabang pelacakan jarak jauh yang dihapus akan kembali berikutnya
git fetch
.Untuk berhenti mengambil cabang-cabang pelacakan jarak jauh Anda perlu secara eksplisit menentukan referensi untuk mengambil. Git / config :
Dalam contoh di atas kami hanya mengambil
master
,develop
dan melepaskan cabang, merasa bebas untuk beradaptasi sesuai kebutuhan.sumber
git fetch origin branchname
atau membuat alias inginft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
mengambil hanya cabang saat ini (favorit pribadi saya). Bersulang.-r
bendera itu? Saya melihatxargs
memiliki-R
argumen tetapi tidak menemukan apa pun tentang-r
. Maksud saya, secara teori jika saya ingat betul caraxargs
kerjanya, bahkan tanpanya-r
harus bekerja.| xargs git branch -d
. Juga, dengan menghapus-r
opsi (--remotes
) darigit branch -d
kami hanya membersihkan cabang lokal (yang mungkin cukup mengingat bahwa secara defaultgit branch
tidak menunjukkan cabang jarak jauh).xargs -r
, yakni--no-run-if-empty
ekstensi GNU artinya, inilah penjelasan yang bagus .Penghapusan selalu merupakan tugas yang menantang dan bisa berbahaya !!! Karena itu, pertama jalankan perintah berikut untuk melihat apa yang akan terjadi:
Dengan melakukan seperti di atas,
git
akan memberi Anda daftar apa yang akan terjadi jika perintah di bawah ini dijalankan.Kemudian jalankan perintah berikut untuk menghapus semua cabang dari repo jarak jauh yang tidak ada dalam repo lokal Anda:
sumber
-n
(dry run) ke perintah ini sehingga Anda dapat melihat perubahan dan kemudian jika semuanya baik-baik saja panggil lagi tanpa-n
.Berikut adalah cara melakukannya dengan SourceTree (v2.3.1):
1. Klik Ambil
2. Periksa "Cabang pelacakan prune ..."
3. Tekan OK
4. 😀
sumber
Saya harus menambahkan jawaban di sini, karena jawaban yang lain tidak mencakup kasus saya atau rumit. Saya menggunakan github dengan pengembang lain dan saya hanya ingin semua cabang lokal yang remote (mungkin digabung dan) dihapus dari PR github yang akan dihapus sekaligus dari mesin saya. Tidak, hal-hal seperti
git branch -r --merged
tidak mencakup cabang-cabang yang tidak digabungkan secara lokal, atau yang tidak bergabung sama sekali (ditinggalkan) dll, jadi diperlukan solusi yang berbeda.Bagaimanapun, langkah pertama yang saya dapatkan dari jawaban lain:
Lari kering
git remote prune origin
sepertinya akan melakukan hal yang sama dalam kasus saya, jadi saya pergi dengan versi terpendek untuk membuatnya tetap sederhana.Sekarang,
git branch -v
harus menandai cabang yang remote-nya dihapus[gone]
. Karena itu, yang perlu saya lakukan adalah:Sesederhana itu, menghapus semua yang saya inginkan untuk skenario di atas.
xargs
Sintaks yang kurang umum adalah agar ia juga berfungsi di Mac & BSD di samping Linux. Hati-hati, perintah ini bukan lari kering sehingga akan menghapus paksa semua cabang yang ditandai[gone]
. Jelas, ini git tidak ada yang hilang selamanya, jika Anda melihat cabang dihapus yang Anda inginkan disimpan Anda selalu dapat membatalkan penghapusan mereka (perintah di atas akan mendaftarkan hash mereka pada penghapusan, jadi sederhanagit checkout -b <branch> <hash>
.sumber
Pangkas cabang yang sama dari referensi lokal dan jarak jauh (dalam contoh saya dari
origin
).sumber