Masalah: Saya ingin cara menghapus semua cabang lokal yang saya miliki yang tidak memiliki remote. Cukup mudah untuk menyalurkan nama-nama cabang menjadi a git branch -D {branch_name}
, tetapi bagaimana cara mendapatkan daftar itu?
Sebagai contoh:
Saya membuat cabang baru tanpa remote:
$ git co -b no_upstream
Saya mendaftar semua cabang saya, dan hanya ada satu dengan remote
$ git branch -a
master
* no_upstream
remotes/origin/HEAD -> origin/master
remotes/origin/master
Perintah apa yang bisa saya jalankan untuk mendapatkan no_upstream
jawaban?
Saya dapat menjalankan git rev-parse --abbrev-ref --symbolic-full-name @{u}
dan itu akan menunjukkan bahwa tidak ada remote:
$ git rev-parse --abbrev-ref --symbolic-full-name @{u}
error: No upstream configured for branch 'no_upstream'
error: No upstream configured for branch 'no_upstream'
fatal: ambiguous argument '@{u}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Tetapi karena ini adalah kesalahan, itu tidak akan membiarkan saya menggunakannya atau menyalurkannya ke perintah lain. Saya bermaksud untuk menggunakan ini baik sebagai skrip shell alias untuk git-delete-unbranched
atau mungkin membuat Permata yang sangat sederhanagit-branch-delete-orphans
sumber
Jawaban:
Saya baru-baru ini menemukan
git branch -vv
versigit branch
perintah yang "sangat bertele-tele" .Ini mengeluarkan cabang bersama dengan cabang jarak jauh jika ada, dalam format berikut:
Setelah Anda memiliki keluaran yang diformat dengan baik ini, semudah menyalurkannya
cut
danawk
mendapatkan daftar Anda:Menghasilkan keluaran sebagai berikut:
The
cut
porsi hanya menormalkan data dengan menghapus dua pertama karakter (termasuk*
) dari output sebelum diteruskan keawk
.The
awk
porsi mencetak kolom pertama jika tidak ada braket persegi di kolom ketiga.Bonus: Buat alias
Permudah untuk dijalankan dengan membuat alias di
.gitconfig
file global Anda (atau di mana pun):Penting: Garis miring terbalik harus di-escape dalam alias atau Anda akan mendapatkan file gitconfig yang tidak valid.
Bonus: Pemfilteran Jarak Jauh
Jika karena alasan tertentu Anda memiliki beberapa remote pelacakan untuk cabang yang berbeda, cukup mudah untuk menentukan remote mana yang ingin Anda periksa. Cukup tambahkan nama remote ke pola awk. Dalam kasus saya,
origin
saya bisa melakukan ini:sumber
WIP:
sih ..? bukankah itu yang dibuat oleh perintah simpanan ..?git branch -vv
, bahkan jika cabang jarak jauh ada dan cocok dengan cabang lokal saya, saya tidak akan melihat di[origin/branch-name]
samping hasilnya. Saya harus kediff
dua daftar cabang untuk benar-benar mencari tahu apa yang hanya lokal.git branch -vv | grep -v origin/
cukup bagi sayagone
?git branch
(tanpa opsi apa pun) hanya mencantumkan cabang lokal, tetapi Anda tidak tahu apakah mereka melacak cabang jauh atau tidak.Biasanya cabang-cabang lokal itu harus dihapus setelah digabungkan
master
(seperti yang terlihat dalam edisi git-sweep ini ):Ini tidak selengkap yang Anda inginkan, tetapi ini adalah permulaan.
sumber
git branch -a --merged
.Saya memiliki masalah serupa. Saya ingin menghapus semua cabang lokal yang melacak cabang jauh yang sekarang dihapus. Saya menemukan bahwa
git remote prune origin
tidak cukup untuk menghilangkan cabang yang ingin saya hilangkan. Setelah remote dihapus, saya ingin lokal juga pergi. Inilah yang berhasil untuk saya:Dari saya
~/.gitconfig
:Berikut adalah
git config --global ...
perintah untuk menambahkan ini dengan mudah sebagaigit prune-branches
:CATATAN : Saya mengubah
-d
ke-D
dalam konfigurasi saya yang sebenarnya, karena saya tidak ingin mendengar Git mengeluh tentang cabang yang tidak digabungkan. Anda mungkin menginginkan fungsionalitas ini juga. Jika demikian, cukup gunakan-D
alih-alih-d
di akhir perintah itu.Juga, FWIW, file konfigurasi global Anda akan selalu seperti itu
~/.gitconfig
.(Perbaikan OS X)
Seperti yang tertulis, ini tidak berfungsi di OS X karena penggunaan
xargs -r
(terima kasih, Korny ).Ini
-r
untuk mencegahxargs
berjalangit branch -d
tanpa nama cabang, yang akan menghasilkan pesan kesalahan "fatal: branch name required
". Jika Anda tidak keberatan dengan pesan kesalahan, Anda cukup menghapus-r
argumen kexargs
dan Anda sudah siap.Namun, jika Anda tidak ingin melihat pesan kesalahan (dan sungguh, siapa yang dapat menyalahkan Anda) maka Anda memerlukan sesuatu yang lain yang memeriksa pipa kosong. Jika Anda mungkin bisa menggunakan ifne dari moreutils . Anda akan memasukkan
ifne
sebelumnyaxargs
, yang akan berhentixargs
berjalan dengan data kosong. CATATAN :ifne
menganggap segala sesuatu tidak kosong, ini termasuk baris kosong, jadi Anda mungkin masih melihat pesan kesalahan itu. Saya belum menguji ini di OS X.Inilah
git config
baris itu denganifne
:sumber
Pengeditan terlambat:
Lebih baik
Tentang GNU / apapun
Jika lebih dari segelintir cabang mungkin, akan ada cara yang lebih baik, menggunakan
comm -23
output darigit branch|sed|sort
dangit config -l|sed|sort
.sumber
Ini bekerja untuk saya:
git branch -vv | grep -v origin
(jika remote Anda bernama selain origin, gantikan).
Ini akan mencantumkan semua cabang yang tidak melacak remote, yang terdengar seperti apa yang Anda cari.
sumber
git fetch --prune
.Saya mensintesis perintah Git saya sendiri untuk mendapatkan
origin/***: gone
cabang:git remote prune origin && git branch -vv
akan mencetak cabang dalam mode verbose.cut -c 3-
akan menghapus karakter pertama.grep ': gone]'
hanya akan mencetak cabang-cabang terpencil yang hilang .awk '{print $1}'
akan mencetak nama cabang.xargs -n1 -r echo git branch -d
akan mencetakgit branch -d
perintah untuk menghapus cabang (-n1 akan mengatur satu perintah per waktu, -r untuk menghindari mengeluarkan perintah jika tidak ada cabang).PETUNJUK: hapus perintah "echo" untuk menjalankan perintah alih-alih hanya mencetak, saya meninggalkan ini di perintah untuk memeriksa perintah sebelum mengeluarkan ke git.
PETUNJUK 2: masalah
git branch -D
jika dan hanya jika Anda yakin ingin menghapus cabang yang tidak digabungkansumber
awk
, saya tidak tahu Anda bisa melakukan itu.Ini adalah sesuatu yang saya gunakan di PowerShell dengan komentar untuk menjelaskan apa yang dilakukannya. Dalam upaya untuk memperjelas apa yang terjadi, saya belum menggunakan perintah PowerShell yang disingkat (alias). Jangan ragu untuk mengompresnya ke tingkat crypticness yang Anda inginkan :)
sumber
Menggabungkan beberapa jawaban yang ada:
Misalnya:
sumber