Menggunakan git gui blame
sulit untuk digunakan dalam skrip, dan sementara git log -G
dan git log --pickaxe
masing-masing dapat menunjukkan kepada Anda ketika definisi metode muncul atau hilang, saya belum menemukan cara untuk membuat daftar semua perubahan yang dibuat pada tubuh metode Anda.
Namun, Anda dapat menggunakan gitattributes
dan textconv
properti untuk mengumpulkan solusi yang dapat melakukannya. Meskipun fitur ini pada awalnya dimaksudkan untuk membantu Anda bekerja dengan file biner, fitur ini berfungsi dengan baik di sini.
Kuncinya adalah meminta Git menghapus semua baris dari file kecuali yang Anda minati sebelum melakukan operasi diff. Kemudian git log
,, git diff
dll. Hanya akan melihat area yang Anda minati.
Inilah garis besar dari apa yang saya lakukan dalam bahasa lain; Anda dapat menyesuaikannya untuk kebutuhan Anda sendiri.
Tulis skrip shell pendek (atau program lain) yang menggunakan satu argumen - nama file sumber - dan hanya menampilkan bagian yang menarik dari file itu (atau tidak ada jika tidak ada yang menarik). Misalnya, Anda dapat menggunakan sed
sebagai berikut:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Tentukan textconv
filter Git untuk skrip baru Anda. (Lihat gitattributes
halaman manual untuk lebih jelasnya.) Nama filter dan lokasi perintah bisa apapun yang Anda suka.
$ git config diff.my_filter.textconv /path/to/my_script
Beri tahu Git untuk menggunakan filter itu sebelum menghitung diff untuk file yang dimaksud.
$ echo "my_file diff=my_filter" >> .gitattributes
Sekarang, jika Anda menggunakan -G.
(perhatikan .
) untuk membuat daftar semua komit yang menghasilkan perubahan yang terlihat saat filter Anda diterapkan, Anda akan memiliki komit yang Anda minati. Opsi lain yang menggunakan rutinitas diff Git, seperti --patch
, akan juga dapatkan tampilan terbatas ini.
$ git log -G. --patch my_file
Voilà!
Satu perbaikan berguna yang mungkin ingin Anda lakukan adalah membuat skrip filter Anda menggunakan nama metode sebagai argumen pertamanya (dan file sebagai yang kedua). Ini memungkinkan Anda menentukan metode baru yang menarik hanya dengan memanggil git config
, daripada harus mengedit skrip Anda. Misalnya, Anda mungkin berkata:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Tentu saja, skrip filter dapat melakukan apa pun yang Anda suka, mengambil lebih banyak argumen, atau apa pun: ada banyak fleksibilitas di luar yang telah saya tunjukkan di sini.