git log -G<regex> -p
adalah alat yang luar biasa untuk mencari sejarah basis kode untuk perubahan yang cocok dengan pola yang ditentukan. Namun, itu bisa menjadi luar biasa untuk menemukan bongkahan yang relevan di output diff / patch di lautan bakhil yang sebagian besar tidak relevan.
Tentu saja mungkin untuk mencari output dari git log
string / regex asli, tetapi itu tidak banyak mengurangi kebisingan visual dan gangguan banyak perubahan yang tidak terkait.
Membaca git log
, saya melihat ada --pickaxe-all
, yang merupakan kebalikan dari apa yang saya inginkan: itu memperluas output (ke seluruh changeset), sedangkan saya ingin membatasi (ke bingkah tertentu).
Pada dasarnya, saya mencari cara untuk "secara cerdas" mengurai diff / patch ke masing-masing bakhil dan kemudian melakukan pencarian terhadap masing-masing bakhil (hanya menargetkan baris yang diubah), membuang bakhil yang tidak cocok, dan menghasilkan yang itu.
Apakah alat seperti yang saya jelaskan ada? Apakah ada pendekatan yang lebih baik untuk mendapatkan bakhil yang cocok / terpengaruh?
Beberapa penelitian awal yang telah saya lakukan ...
Jika dimungkinkan untuk
grep
keluaran diff / patch dan membuat nilai opsi konteks menjadi dinamis — katakanlah, melalui regexps alih-alih jumlah baris — itu mungkin sudah cukup. Tapigrep
tidak persis seperti itu (saya juga tidak perlu meminta fitur itu).Saya menemukan paket patchutils , yang awalnya terdengar seperti mungkin sesuai dengan kebutuhan saya. Tetapi setelah membaca
man
halaman - halamannya, alat tersebut tampaknya tidak menangani bakhil yang cocok berdasarkan regexps. (Mereka dapat menerima daftar orang bakhil, meskipun ...)Saya akhirnya menemukan splitpatch.rb , yang tampaknya menangani penguraian tambalan dengan baik, tetapi perlu ditambah secara signifikan untuk menangani pembacaan tambalan melalui
stdin
, mencocokkan bakhil yang diinginkan, dan kemudian menghasilkan bakhil.
Jawaban:
di sini /programming//a/35434714/5305907 dijelaskan cara untuk melakukan apa yang Anda cari. secara efektif:
git diff -U1 | grepdiff 'console' --output-matching=hunk
Ini hanya menampilkan bakhil yang cocok dengan string "konsol" yang diberikan.
sumber
grepdiff
pada dasarnya adalah apa yang saya inginkan; saya pasti melewatkan opsi pencocokan pasangannya! Namun ... info git commit dilucutigrepdiff
, jadi setelah Anda menemukan bingkah yang relevan, Anda harus melihat sha kom dari objek / gumpalan sha di header diff-operasi yang cukup mahal. (lihat stackoverflow.com/a/223890/2284440 ) itu akan menjadi sepertigit find-object SHA --reverse | head -1 | cut -c 1-7 | { read sha ; git log -1 $sha; }
grepdiff
yang lebih barebones dalam hal argumen yang diterima. perhatikan bahwa ketika cowok yang cocok adalah cowok terakhir dalam diff, itu salah memasukkan header git commit dari commit berikut — sesuatu yang benar-benar membingungkan saya sampai saya menyadari apa yang terjadi!Tidak persis apa yang Anda minta, tetapi satu cara untuk memahami bakhil adalah mode add-interaktif. Ini mengharuskan Anda untuk memeriksa komit setelah tambalan yang Anda minati
lalu kembali satu langkah lagi di VCS, tetapi tidak di direktori kerja
(Pada titik ini, perbedaan antara indeks dan direktori kerja akan sesuai dengan patch yang Anda minati.)
Anda sekarang dapat mengeksekusi
git add -p
. Ini akan meluncurkan sesi interaktif yang memiliki/
opsi, yang memungkinkan Anda untuk menemukan bakhil di mana beberapa baris cocok dengan regex. Sangat berguna jika Anda benar-benar ingin memproses tambalan-tambalan itu (seperti, menyiapkan pick-cherry parsial).Sayangnya, setidaknya saat ini
/
perintahadd -p
hanya berfungsi dalam satu file, jadi Anda mungkin perlu melewati beberapa file yang tidak relevan.sumber
Membangun jawaban di atas oleh @nagu, dan jawaban terkait lainnya, saya hanya bisa
git log -G
menunjukkan bakhil yang relevan.Pertama buat skrip di suatu tempat di $ PATH Anda dengan konten ini:
Panggil
git log -G
dan beri tahu Git untuk menggunakanpickaxe-diff
skrip sebagai driver diff eksternal:Ini akan menggunakan skrip pickaxe-diff hanya untuk menghasilkan diff, sehingga sisa
git log
output (komit hash, pesan, dll) akan tersentuh.Peringatan
Cara kerja beliung Git adalah membatasi keluaran ke file yang bakhilnya mengubah string / regex yang diberikan. Ini berarti bahwa jika sepotong lain dalam file ini juga berisi string pencarian / regex, tetapi tidak mengubahnya, itu masih akan ditampilkan dengan skrip di atas. Ini adalah batasan grepdiff. Ada permintaan tarik terbuka di proyek patchutils untuk menambahkan
--only-matching
bendera ke grepdiff, yang akan menyediakan fungsionalitas yang diperlukan untuk memfilter bakhun ini dengan benar.Saya melakukan penulisan solusi saya di intisari ini .
sumber