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.

JD Isaacks
fonte
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
ralphtheninja
fonte
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.

Antoine Pelisse
fonte
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"
Dmitry Reznik
fonte
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.

pilha de perguntas
fonte