Git pesquisa por string no histórico de um único arquivo


172

Portanto, se eu tiver um arquivo chamado foo.rb e ele estiver fornecendo um erro para um método ausente chamado bar , desejo pesquisar no histórico de foo.rb a string barpara ver se ela já foi definida no passado.

Encontrei esta pesquisa em toda a história do Git por uma string?

Mas isso pesquisa todos os arquivos. Eu só quero procurar em um arquivo.


6
Assim como um FYI, você pode anexar -- filenamea vários comandos git se quiser limitá-lo a um arquivo.
Karl Bielefeldt

Respostas:


234

Para esse fim, você pode usar a opção -S para git log:

git log -S'bar' -- foo.rb

39
Ou git log -G'bar' -- foo.rbprocure por diff que contenha 'bar' em vez de confirmações que alteraram o número de ocorrências de 'bar' (consulte a página de manual do git-log).
Jakub Narębski

1
Não funcionou para mim com as aspas, eu tive que usá -Sbar-lo para procurar bar . Talvez tenha algo a ver comigo usando a linha de comando do Windows.
ZBR

em outras palavras, -Gé para uma pesquisa regex ... essa também é uma ótima referência: stackoverflow.com/a/4472267/2586761
ptim

17

Ou talvez você possa tentar este (a partir de perguntas relacionadas Pesquise todo o histórico do git por string )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

Na verdade, ele procurará o conteúdo do arquivo e não enviará mensagens / patches para qualquer ocorrência de barra.


Para Windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(relógio para aspas duplas se nome do arquivo ou procurar frase tem espaços)
biscuit314

1
Para mim, no Windows, não funcionou sem "do": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (observe aspas duplas se o nome do arquivo ou a frase de pesquisa tiver espaços)
xberger

2

Há uma substituição para o comando git log (do manual ):

$ git log Makefile      # commits that modify Makefile

Então você pode usar:

git log foo.rb | grep "bar"

2
Obrigado, mas isso apenas pesquisa o histórico de confirmação, não o histórico da fonte do arquivo.
JD Isaacks 18/04

2
Na verdade, há uma outra substituição que as buscas para a mudança de dados de cadeia: git log -S'foo ()' # commits que adicionar ou remover quaisquer dados de arquivos correspondentes a string 'foo ()'
Dmitry Reznik

1
Você também pode tentar usar o parâmetro --full-diff. Os logs não mostram apenas o histórico de confirmações, mas também as diferenças.
Dmitry Reznik

@DmitriyReznik - aparentemente --full-diffnão funciona (como em, não diff é mostrado), sem -p, pelo menos no git 1.7.9.5
sdaau

0

Eu usei o git log -S "string" --follow -p "path of file"que mostra o histórico completo de todas as alterações com essa string.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.