Saya memiliki repositori Git dengan beberapa cabang dan komit menggantung. Saya ingin mencari semua commit di repositori untuk string tertentu.
Saya tahu cara mendapatkan log dari semua commit dalam sejarah, tetapi ini tidak termasuk cabang atau gumpalan yang menggantung, hanya sejarah HEAD. Saya ingin mendapatkan semuanya, untuk menemukan komit tertentu yang salah tempat.
Saya juga ingin tahu bagaimana melakukan ini di Mercurial, karena saya sedang mempertimbangkan saklar.
Jawaban:
Anda dapat melihat komit menggantung dengan
git log -g
.Jadi Anda bisa melakukan ini untuk menemukan string tertentu dalam pesan komit yang menggantung:
Atau, jika Anda ingin mencari perubahan untuk string tertentu, Anda dapat menggunakan opsi pencarian beliung, "-S":
Git 1.7.4 akan menambahkan opsi -G , memungkinkan Anda untuk melewatkan -G <regexp> untuk menemukan ketika baris yang mengandung <regexp> dipindahkan, yang -S tidak bisa lakukan. -S hanya akan memberi tahu Anda ketika jumlah total baris yang berisi string berubah (yaitu menambah / menghapus string).
Akhirnya, Anda bisa menggunakan gitk untuk memvisualisasikan komit yang menggantung dengan:
Dan kemudian gunakan fitur pencariannya untuk mencari file yang salah tempat. Semua pekerjaan ini dengan asumsi komit yang hilang belum "kedaluwarsa" dan telah dikumpulkan, yang dapat terjadi jika menggantung selama 30 hari dan Anda kedaluwarsa reflog atau menjalankan perintah yang kedaluwarsa.
sumber
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
Di Mercurial Anda gunakan
hg log --keyword
untuk mencari kata kunci dalam pesan komit danhg log --user
untuk mencari pengguna tertentu. Lihathg help log
cara lain untuk membatasi log.sumber
hg log -k
pencarian komit nama pengguna dan nama file di changesets juga (saya melihat itu di commands.py:log), yang merupakan salah satu dari beberapa hal yang saya tidak mengerti di hg. Seharusnya ada opsi terpisah untuk mencari dalam pesan komit dan nama file. Sepertinyahg log --template '{desc}\n'|grep
cara yang pasti.hg grep --all <term>
Selain jawaban richq menggunakan
git log -g --grep=<regexp>
ataugit grep -e <regexp> $(git log -g --pretty=format:%h)
: lihat posting blog berikut oleh Junio C Hamano, pengelola git saat iniRingkasan
Kedua git grep dan git log --grep yang garis berorientasi , dalam bahwa mereka mencari jalur yang cocok dengan pola yang telah ditentukan.
Anda dapat menggunakan
git log --grep=<foo> --grep=<bar>
(ataugit log --author=<foo> --grep=<bar>
yang diterjemahkan secara internal menjadi dua--grep
) untuk menemukan komit yang cocok dengan salah satu pola (implisit ATAU semantik).Karena menjadi line-berorientasi, berguna dan semantik adalah dengan menggunakan
git log --all-match --grep=<foo> --grep=<bar>
untuk menemukan komit yang memiliki kedua pencocokan baris pertama dan baris yang cocok di suatu tempat kedua.Dengan
git grep
Anda dapat menggabungkan beberapa pola (semua yang harus menggunakan-e <regexp>
bentuk) dengan--or
(yang merupakan default),--and
,--not
,(
dan)
. For grep--all-match
berarti file tersebut harus memiliki garis yang cocok dengan setiap alternatif.sumber
Berdasarkan jawaban rq, saya menemukan baris ini melakukan apa yang saya inginkan:
Yang akan melaporkan ID komit, nama file, dan menampilkan garis yang cocok, seperti ini:
... Apakah ada yang setuju bahwa ini akan menjadi opsi yang bagus untuk dimasukkan dalam perintah standar git grep?
sumber
Perintah apa pun yang menggunakan referensi sebagai argumen akan menerima
--all
opsi yang didokumentasikan dalam halaman manualgit rev-list
sebagai berikut:Jadi misalnya
git log -Sstring --all
akan menampilkan semua komit yang menyebutkanstring
dan yang dapat diakses dari cabang atau dari tag (Saya mengasumsikan bahwa komit Anda menggantung setidaknya dinamai dengan tag).sumber
git grep
, di mana--all
tampaknya diterjemahkan ke / digunakan sebagai--all-match
. Ini terlihat seperti bug bagi saya .. menggunakan Git 1.7.2.3 (menggunakan$(git rev-list --all)
karya).Dengan Mercurial Anda melakukan a
Ada opsi lain yang mempersempit rentang revisi yang dicari.
sumber
hg grep --all
Tidak tahu tentang git, tetapi di Mercurial saya hanya akan menyalurkan output dari hg log ke beberapa sed / perl / script apa pun untuk mencari apa pun yang Anda cari. Anda dapat menyesuaikan output log hg menggunakan templat atau gaya agar lebih mudah dicari, jika diinginkan.
Ini akan mencakup semua cabang bernama dalam repo. Mercurial tidak memiliki sesuatu seperti menggantung gumpalan afaik.
sumber
jika Anda adalah pengguna vim, Anda dapat menginstal tig (apt-get install tig), dan menggunakan /, perintah yang sama untuk mencari di vim
https://blogs.atlassian.com/2013/05/git-tig/
sumber
Untuk menambahkan satu lagi solusi yang belum disebutkan, saya harus mengatakan bahwa menggunakan kotak pencarian grafis gitg adalah solusi paling sederhana untuk saya. Ini akan memilih kejadian pertama dan Anda dapat menemukan yang berikutnya dengan Ctrl-G.
sumber
Satu perintah di git yang menurut saya lebih mudah untuk menemukan string:
bekerja di Git 2.0.4
sumber