Inilah alur kerja git saya.
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 - baik lokal maupun jarak jauh - sebagai berikut:
git Push Origin :heads/devel
git branch -d devel
Sekarang jika saya melakukan git branch -a
di komputer A, saya mengerti
master
Origin/HEAD
Origin/master
Saya sekarang masuk ke komputer B. Lakukan git fetch
. Saya dapat menghapus cabang devel lokal dengan
git branch -d devel
Tapi saya tidak bisa menghapus cabang devel jarak jauh.
git Push Origin :heads/devel
error: unable to Push to unqualified destination: heads/proxy3d
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
fatal: The remote end hung up unexpectedly
Melakukan git branch -a
masih mencantumkan Origin/devel di cabang jauh.
Bagaimana saya bisa membersihkan entri remote devel dari mesin B?
Pertama, apa hasil git branch -a
pada mesin B?
Kedua, Anda telah menghapus heads/devel
pada Origin
, jadi itu sebabnya Anda tidak dapat menghapusnya dari mesin B.
Mencoba
git branch -r -d Origin/devel
atau
git remote Prune Origin
atau
git fetch Origin --Prune
dan jangan ragu untuk menambahkan --dry-run
ke akhir pernyataan git
Anda untuk melihat hasil menjalankannya tanpa benar-benar menjalankannya.
Pertimbangkan untuk menjalankan:
git fetch --Prune
Secara teratur di setiap repo untuk menghapus cabang lokal yang telah melacak cabang jauh yang dihapus (tidak ada lagi di repo GIT jarak jauh).
Ini dapat disederhanakan dengan
git config remote.Origin.Prune true
ini adalah pengaturan per-repo
yang akan membuat git fetch or git pull
di masa depan menjadi secara otomatis Prune .
Untuk mengatur ini untuk pengguna Anda, Anda juga dapat mengedit .gitconfig global dan menambahkan
[fetch]
Prune = true
Namun, disarankan agar ini dilakukan dengan menggunakan perintah berikut:
git config --global fetch.Prune true
atau menerapkannya secara luas (tidak hanya untuk pengguna)
git config --system fetch.Prune true
Berikut ini skrip bash yang dapat melakukannya untuk Anda. Ini versi modifikasi dari script http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Modifikasi saya memungkinkannya untuk mendukung lokasi terpencil yang berbeda.
#!/bin/bash
current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching merged branches...\n"
git remote update --Prune
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
echo "No existing branches have been merged into $current_branch."
else
echo "This will remove the following branches:"
if [ -n "$remote_branches" ]; then
echo "$remote_branches"
fi
if [ -n "$local_branches" ]; then
echo "$local_branches"
fi
read -p "Continue? (y/n): " -n 1 choice
echo
if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
remotes=`echo "$remote_branches" | sed 's/\(.*\)\/\(.*\)/\1/g' | sort -u`
# Remove remote branches
for remote in $remotes
do
branches=`echo "$remote_branches" | grep "$remote/" | sed 's/\(.*\)\/\(.*\)/:\2 /g' | tr -d '\n'`
git Push $remote $branches
done
# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
else
echo "No branches removed."
fi
fi
Perintah ini akan "dry run" menghapus semua cabang gabungan (Origin
) jarak jauh, selain master
. Anda bisa mengubahnya, atau, tambahkan cabang tambahan setelah master: grep -v for-example-your-branch-here |
git branch -r --merged |
grep Origin |
grep -v '>' |
grep -v master |
xargs -L1 |
awk '{sub(/Origin\//,"");print}'|
xargs git Push Origin --delete --dry-run
Jika terlihat bagus, hapus --dry-run
. Selain itu, Anda mungkin ingin menguji ini menggunakan garpu terlebih dahulu.
Jika git branch -r
menunjukkan banyak cabang pelacak jarak jauh yang tidak Anda minati dan Anda ingin menghapusnya hanya dari lokal, gunakan perintah berikut:
git branch -r | grep -Ev 'HEAD|master|develop' | xargs -r git branch -rd
Versi yang lebih aman hanya dengan menghapus yang digabungkan:
git branch -r --merged | grep -Ev 'HEAD|master|develop' | xargs -r git branch -rd
Ini mungkin berguna untuk proyek-proyek besar, di mana Anda tidak memerlukan cabang fitur rekan tim lain tetapi memiliki banyak cabang pelacakan jarak jauh diambil pada klon awal.
Dan langkah ini saja tidak lengkap karena cabang-cabang pelacakan jarak jauh yang dihapus akan muncul lagi pada git fetch
berikutnya.
Untuk berhenti mengambil cabang-cabang pelacakan jarak jauh Anda perlu secara eksplisit menentukan referensi untuk mengambil di .git/config :
[remote "Origin"]
# fetch = +refs/heads/*:refs/remotes/Origin/*
fetch = +refs/heads/master:refs/remotes/Origin/master
fetch = +refs/heads/develop:refs/remotes/Origin/develop
fetch = +refs/heads/release/*:refs/remotes/Origin/release/*
Dalam contoh di atas kami hanya mengambil master
, develop
dan melepaskan cabang, merasa bebas dan menambahkan milik Anda.
Penghapusan selalu merupakan tugas yang menantang dan bisa berbahaya !!! Oleh karena itu, pertama jalankan perintah berikut untuk melihat apa yang akan terjadi:
git Push --all --Prune --dry-run
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:
git Push --all --Prune
Saya harus menambahkan jawaban di sini, karena jawaban yang lain tidak mencakup kasus saya atau tidak perlu rumit . Saya menggunakan github dengan pengembang lain dan saya hanya ingin semua cabang lokal yang memiliki 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 cabang-cabang yang tidak bergabung sama sekali (terbengkalai, dll), sehingga diperlukan solusi yang berbeda.
Bagaimanapun, langkah pertama yang saya dapatkan dari jawaban lain:
git fetch --Prune
Jalankan git remote Prune Origin
kering sepertinya akan melakukan hal yang sama dalam kasus saya, jadi saya pergi dengan versi terpendek agar tetap sederhana.
Sekarang, git branch -v
harus menandai cabang yang remote-nya dihapus sebagai [gone]
. Karena itu, yang perlu saya lakukan adalah:
git branch -v|grep \\[gone\\]|awk '{print $1}'|xargs -I{} git branch -D {}
Sesederhana itu, menghapus semua yang saya inginkan untuk skenario di atas.
Sintaks xargs
yang kurang umum adalah sehingga ia juga bekerja di Mac & BSD selain Linux . Hati-hati, perintah ini bukan proses yang berjalan sehingga akan menghapus paksa semua cabang yang ditandai sebagai [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 git checkout -b <branch> <hash>
sederhana.