Masalah

Saya sedang mengerjakan repositori git. Saya memiliki blobID, yang saya tahu berasal dari repositori ini. Saya ingin membuat daftar semua komit yang melibatkan blobId ini.

Melihat beberapa pertanyaan StackOverflow yang ada, saya membuat perintah berikut:

git log --oneline --find-object <blobID>`

Namun, untuk beberapa blobIDs, saya tidak mendapatkan hasil apa pun...

Cara memperbanyak

  • Klon git dari GitHub.
  • Kami ingin membuat daftar semua komit yang berisi blobID berikut : 8b01793845ff65b7e3244259842af3d3de63e0a1
  • git log --oneline --find-object 8b01793845ff65b7e3244259842af3d3de63e0a1 tidak menghasilkan apa-apa.
  • Namun, komit 27d7c8599b dengan jelas memperkenalkan blobIdD ini untuk file t/t5323-pack-redundant.sh

Apakah Anda memiliki penjelasan untuk perilaku seperti itu?
Dan karenanya, proposisi untuk perintah yang benar untuk mencapai tujuan saya.

1
plalanne 26 Mei 2021, 19:54

1 menjawab

Jawaban Terbaik

TL;DR: itu gabungan terkutuk itu lagi. Gunakan -m.

$ git log --oneline --find-object 8b01793845ff65b7e3244259842af3d3de63e0a1

Memang tidak mencetak apa-apa. Kecurigaan pertama saya adalah bahwa jika itu cukup baru, kita mungkin perlu --all atau --remotes untuk menemukan objek melalui beberapa nama pelacakan jarak jauh, tetapi itu tidak ada bedanya di sini. Namun:

$ git log -m --oneline --find-object 8b01793845ff65b7e3244259842af3d3de63e0a1
6aae0e2ad2 (from 6aac70a870) Merge branch 'jh/simple-ipc-sans-pthread'
36a255acd1 (from 1e1c4c5eac) Merge branch 'zh/ref-filter-push-remote-fix'
e004fd6b69 (from e6f68f62e0) Merge branch 'ls/typofix'
52371bf449 (from 3a7f0908b6) Merge branch 'mt/clean-clean'
    [many more output lines snipped]
27d7c8599b (from 8b70966aa9) Merge branch 'js/default-branch-name-tests-final-stretch'

Namun, komit 27d7c8599b dengan jelas memperkenalkan blobIdD ini untuk file t/t5323-pack-redundant.sh

Memang, ini adalah komit terakhir dalam output di atas.

Apakah Anda memiliki penjelasan untuk perilaku seperti itu?

Itu disembunyikan dengan hati-hati di depan mata dalam deskripsi --find-object di dokumentasi git log :

--find-object=<object-id>
Cari perbedaan yang mengubah jumlah kemunculan objek tertentu. Mirip dengan -S, hanya argumennya yang berbeda karena tidak mencari string tertentu tetapi untuk id objek tertentu.

Sekarang, kita sudah tahu—yah, kita tahu jika kita menghabiskan banyak waktu untuk bertarung dengan Git —bahwa git log secara default tidak perlu melakukan diff sama sekali dengan penggabungan berkomitmen. Ini berarti bahwa -S dan -G sepenuhnya mengabaikan penggabungan komit juga. Ini membuat semua orang naik setidaknya sekali saat mencari komit gabungan mana yang benar-benar menjatuhkan beberapa kode alih-alih memperbaiki konflik dengan benar.

Menambahkan salah satu opsi pemaksa diff—-m, -c, atau --cc—ke git log memaksanya untuk menghasilkan diff dari setiap komit gabungan. Perbedaan gabungan sering kali tidak berguna di sini juga, tetapi perbedaan -m selalu berfungsi dan selalu menemukan apa yang kita cari (asalkan kita juga tahu bagaimana menangani masalah yang disebabkan oleh Penyederhanaan Sejarah, yaitu).

Karena --find-object seperti -S, perlu penanganan yang sama.

3
torek 27 Mei 2021, 01:18