Por que o git log não mostra o histórico de um arquivo movido e o que posso fazer a respeito?


90

Renomeei alguns arquivos usando git mv, usei git stash, dei uma olhada rápida em HEAD (sem alterá-lo) e, em seguida, fiz git stash poppara obter o lote inteiro de volta. Meus movimentos haviam desaparecido da lista de commits, então eu os refiz com git rme a mensagem de commit afirmava que git havia visto que a renomeação era uma renomeação. Então, não pensei mais nisso.

Mas agora, pós-commit, não consigo acessar o histórico dos arquivos movidos! Aqui está o que o git diz sobre o commit em questão:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Agora estou tentando obter o histórico de um desses arquivos movidos, para que possa olhar para uma versão antiga, mas não consigo nada muito útil:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Eu também tentei sem -M, -Ce --find-copies-harder, mas sem sucesso.)

Posso colocar o histórico com o nome antigo, que para no ponto em que foi excluído do local antigo:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Portanto, não estou completamente preso desta vez, mas não gostaria de ter que fazer esse tipo de coisa o tempo todo. (Prevejo ter um bom número de arquivos que serão movidos pelo menos uma vez na vida.)

Estou fazendo algo errado? A cópia antiga do arquivo e a nova cópia são 98,8% iguais (2 linhas de 166 alteradas). Meu entendimento é que o git deve ser capaz de rastrear o arquivo neste caso, porque infere operações de renomeação em vez de armazená-los explicitamente, e os arquivos são semelhantes o suficiente para que eu acredite que deva considerá-los iguais.

Posso fazer alguma coisa para consertar isso?


Adivinha: Funciona se você executar o comando dentro de ~ / projects / em vez de ~ / projects / system / runtime / src?
Douglas

Não, obtenho o mesmo resultado. (Geralmente git parece muito bom em permitir que você esteja em qualquer pasta de qualquer maneira ...)

Isso me deu uma ideia e atualizei a pergunta com minhas descobertas. Obrigado pelo comentário!

Estou usando "tortoiseGit 1.5.8.0" junto com "1.7.3.1.msysgit.0" no mswindows. Quando eu renomear + confirmar um arquivo no explorer, vejo na minha gui "status = Rename". Eu não sei o suficiente sobre git como fazer isso na linha de comando para responder "como fazer isso", mas o tortoiseGit fez algo para mim que funcionou como você esperava.
k3b

Respostas:



28

Bem, eu vejo meus renomeados com git log -M --summary..


git log -M --summarynão fornece nenhuma informação de renomeação se você estiver apenas olhando para o histórico de um determinado arquivo, ou seja, com um argumento de arquivo.
vinc17

17

Respondendo minha própria pergunta, já que consegui amenizar minhas preocupações, mesmo que não tenha resolvido exatamente meu problema. ( git log --followainda não funciona para mim, no entanto).

Em primeiro lugar, o --summarylog do commit de renomeação inclui a deletelinha com o nome antigo do arquivo. Portanto, se for fácil de localizar, você poderá encontrar seu nome antigo e git logde lá.

Se for parte de algum commit grande e, portanto, um pouco mais difícil de detectar - e essa situação foi uma das minhas preocupações - git blame -Cpode ser usado com o novo nome do arquivo na primeira revisão pós-renomeação. Presumivelmente, restam linhas do arquivo original! - então o git deve encontrar sua fonte e mostrar o nome do arquivo antigo (e um hash de commit para uma boa medida). Você pode então pegar a trilha com git log.

Portanto, se você tiver algum interesse no histórico do arquivo como uma unidade (por qualquer motivo), parece que isso pode ser feito de maneira relativamente direta. Embora eu tenha a impressão de que o git preferiria que você o usasse corretamente.


6
Acho que você precisa da opção -M para realmente mostrar os renomeamentos em vez de excluir / adicionar
Adrian Cornish

1
Apenas tive o mesmo problema e notei que seu diretório de trabalho faz diferença git log --follow .onde o diretório de trabalho é o novo local não funciona, enquanto git log --follow path/to/new/dir, executado a partir de um diretório pai comum do antigo e do novo local, funciona
akraf

1
O --followparâmetro funciona, mas você precisa fazer:git log --follow -- ./path/to/file
DrumM

Acabei de ter o problema que git -log filename.cspára na confirmação de movimento do arquivo (dir atual é definido para a pasta do arquivo). No entanto, a janela de histórico do VS mostra todo o registro de alterações do arquivo. Também posso ver que o arquivo foi movido com a área de trabalho do Github. Mas git log -10 --follow filename.csmostra o log antes de mover o commit também.
oleksa

11
git log --follow ./path/to/file

Eu acredito que é isso que você está procurando.


3
A resposta de cinco anos anteriores traz essa informação.
dotancohen
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.