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 pop
para obter o lote inteiro de volta. Meus movimentos haviam desaparecido da lista de commits, então eu os refiz com git rm
e 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
, -C
e --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?
Respostas:
Por favor, tente com
git log --follow
em seu arquivo. Aprendo aqui É possível mover / renomear arquivos no git e manter seu histórico?fonte
fatal: ambiguous argument 'file.txt': unknown revision or path not in the working tree
, tente git log --follow - file.txtBem, eu vejo meus renomeados com
git log -M --summary
..fonte
git log -M --summary
nã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.Respondendo minha própria pergunta, já que consegui amenizar minhas preocupações, mesmo que não tenha resolvido exatamente meu problema. (
git log --follow
ainda não funciona para mim, no entanto).Em primeiro lugar, o
--summary
log do commit de renomeação inclui adelete
linha com o nome antigo do arquivo. Portanto, se for fácil de localizar, você poderá encontrar seu nome antigo egit log
de 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 -C
pode 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 comgit 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.
fonte
git log --follow .
onde o diretório de trabalho é o novo local não funciona, enquantogit log --follow path/to/new/dir
, executado a partir de um diretório pai comum do antigo e do novo local, funciona--follow
parâmetro funciona, mas você precisa fazer:git log --follow -- ./path/to/file
git -log filename.cs
pá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. Masgit log -10 --follow filename.cs
mostra o log antes de mover o commit também.Eu acredito que é isso que você está procurando.
fonte