Eu sou relativamente novo no git, usei o Subversion antes.
Notei que a maioria dos front-ends gráficos do git e dos plugins IDE não parecem capazes de exibir o histórico de um arquivo se o arquivo tiver sido renomeado. Quando eu uso
git log --follow
na linha de comando, posso ver o log inteiro entre os renomeados.
De acordo com Linus Torvalds, o switch --follow é um prazer "SVN noob", usuários sérios do git não o usam:
--follow é um hack total, destinado apenas a satisfazer ex-usuários do SVN que nunca souberam nada sobre coisas como paternidade ou bons gráficos de revisão.
Não é totalmente fundamental, mas a implementação atual do "--follow" é realmente um processo rápido de pré-processamento, aparafusado na lógica de revisão, em vez de ser algo realmente integral.
Ele foi literalmente projetado como um agradador de "SVN noob", não como uma coisa de "funcionalidade real do git". A idéia era que você se afastaria da mentalidade (quebrada) de pensar que renomeia a matéria no quadro geral.
Minha pergunta : Como os usuários hardcore de git entre vocês obtêm o histórico de um arquivo quando ele foi renomeado? Qual é a maneira 'real' de fazer isso?
git mv oldfile newfile
não provoca a mudança de nome a ser gravado em tudo - é apenas o mesmo que excluir um arquivo e adicionar outro. O git apenas renomeia e copia o estado da árvore em cada commit após o fato./bin/mv oldfile newfile
), mas o fizergit add newfile; git rm oldfile
, o resultado será indistinguível do degit mv oldfile newfile
.git log --follow
melhora um pouco com o git 2.9 (junho de 2016): veja minha resposta abaixo--color-moved
quando vocêdiff
.Respostas:
Eu acho que o ponto principal por trás do argumento Linus é que - e leve isso com uma pitada de sal - os usuários hardcore de git nunca se importam com a história de um "arquivo". Você coloca o conteúdo em um repositório git porque o conteúdo como um todo tem um histórico significativo.
A renomeação de arquivo é um pequeno caso especial de "conteúdo" que se move entre caminhos. Você pode ter uma função que se move entre os arquivos que um usuário do git pode rastrear com "picareta" funcionalmente (por exemplo
log -S
).Outras mudanças no "caminho" incluem combinar e dividir arquivos; O git realmente não se importa com o arquivo que você considera renomeado e qual arquivo você considera copiado (ou renomeado e excluído), apenas acompanha o conteúdo completo da sua árvore.
O git incentiva o pensamento de "árvore inteira", onde muitos sistemas de controle de versão são muito centrados em arquivos. É por isso que o git se refere a "caminhos" com mais frequência do que a "nomes de arquivos".
fonte
--follow
para isso?--follow
ser o padrão. O que quero dizer é que quando quero ver o histórico do código em um arquivo, geralmente não me importo se o arquivo foi renomeado ou não, apenas quero ver o histórico do código, independentemente de renomear. Então, na minha opinião, faz sentido--follow
ser o padrão, porque não me importo com arquivos individuais;--follow
me ajuda a ignorar as renomeações de arquivos individuais, que geralmente são bastante irrelevantes.Eu tenho exatamente o mesmo problema que você está enfrentando. Embora eu não possa responder, acredito que você possa ler este e-mail que Linus escreveu em 2005, é muito pertinente e pode lhe dar uma dica sobre como lidar com o problema:
Eu o encontrei referenciado por este post do blog, o que também pode ser útil para você encontrar uma solução viável:
Por favor, mantenha-nos informados sobre seu progresso nisso.
fonte
--color-moved
, o Git v2.15 adiciona uma mudança para esse "sistema de rastreamento ideal". Eu estava brincando com ele para ver as linhas movidas dentro de um arquivo, mas percebi acidentalmente que elas rastreavam as linhas movidas em todo o diff.--follow
pode estar errado (por exemplo, se 2 arquivos tiverem o mesmo conteúdo ou se houver uma modificação além da movimentação do arquivo).Você ficará feliz em saber que algumas ferramentas populares da interface do usuário do Git agora suportam isso. Existem dezenas de ferramentas de interface do usuário do Git disponíveis, portanto não listarei todas, mas, por exemplo:
Mais informações sobre as ferramentas de interface do usuário do Git:
fonte
Nota: o git 2.9 (junho de 2016) melhorará bastante a natureza de "buggy" de
git log --follow
:Veja commit ca4e3ca (30 de março de 2016) por SZEDER Gábor (
szeder
) .(Mesclado por Junio C Hamano -
gitster
- na commit 26effb8 , 13 de abril de 2016)diffcore: corrige a ordem de iteração de arquivos idênticos durante a detecção de renomeação
(observe a inversão aqui:,
B/file -> A/file
eA/file -> B/file
)fonte
No Linux, verifiquei que o SmartGit e o GitEye são capazes de seguir os nomes renomeados ao seguir o histórico de um arquivo específico. No entanto, diferentemente do gitk e do GitEye, o SmartGit mostra uma visualização de arquivo e repositório separadas (que contém a estrutura de diretórios, mas não a lista de arquivos contidos)
fonte