ti-enxame.com

Como posso impedir que o git pense que renomeei

Eu tenho dois arquivos index.html e template.html. Mudei a maior parte de index.html para dentro template.html e agora o git acha que renomeei quando adiciono os dois arquivos. É possível evitar isso em casos específicos?

67
Kit Sunde

Existe uma resposta "aceita", mas não fornece nenhuma dica sobre como responder à pergunta.

A resposta correta, de git-log (1) e git-diff (1) é:

   --no-renames
       Turn off rename detection, even when the configuration
       file gives the default to do so.
11
mat

Por que o Git pensa que seus arquivos são cópias

Faixas do Git conteúdo, não nomes de arquivos. Como resultado, se dois arquivos tiverem conteúdo substancialmente semelhante, o git achará que você copiou ou renomeou o arquivo. Se você ler git-log (1), aprenderá:

O índice de similaridade é a porcentagem de linhas inalteradas e o índice de dissimilaridade é a porcentagem de linhas alteradas. É um número inteiro arredondado, seguido por um sinal de porcentagem. O valor do índice de similaridade de 100% é, portanto, reservado para dois arquivos iguais, enquanto a dissimilaridade de 100% significa que nenhuma linha do arquivo antigo chegou ao novo.

Então, supondo que seu índice de similaridade seja 100%, o git pensará que é uma cópia. Sua melhor aposta é adicionar uma mensagem ou nota sensata de log (consulte notas do git (1) para saber mais sobre isso) para explicar o que está acontecendo se você não acha que o git está fazendo a coisa certa.

Ajustando o Índice de Similaridade

Você também pode tentar ajustar os valores que o git usa para considerar algo que uma cópia ou renomeação. O manual do git-log (1) diz:

-M[<n>], --find-renames[=<n>]

If generating diffs, detect and report renames for each commit. For
following files across renames while traversing history, see --follow. If
n is specified, it is a threshold on the similarity index (i.e. amount
of addition/deletions compared to the file’s size). For example, -M90%
means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.

-C[<n>], --find-copies[=<n>]    

Detect copies as well as renames. See also --find-copies-harder.
If n is specified, it has the same meaning as for -M<n>.

Novamente, isso não ajudará se os arquivos forem semelhantes, mas certamente você poderá usar esses valores para ajustar como semelhantes que eles precisam para serem considerados cópias ou renomeados. Sua milhagem pode variar.

54
Todd A. Jacobs

Se você estiver em um momento antes de um commit e "você se sentir mal com o git enlouquecido", apenas desfaça a adição do arquivo ambíguo que o git pensou que você renomeou, execute um commit e adicione o arquivo ambíguo novamente e confirme:

git reset ambiguous_file_git_thought_you_renamed
git commit
git add ambiguous_file_git_thought_you_renamed
git commit

Isso funcionou para mim.

A verificação dupla não foi renomeada:

git diff --name-status -C HEAD^^ HEAD
M       ambiguous_file_git_thought_you_renamed
M       original_file

"M" no início significa modificado, "R" significa renomeado. Observe que não existe Renomeado aqui.

20
Basil Musa

Para contornar o git pensando que é uma renomeação no "one" commit.

  1. Preparar e confirmar suas alterações que não acionam a renomeação incorreta
  2. Prepare os arquivos restantes que fizeram o git pensar que havia sido renomeado e confirmado com git commit --amend
0
wyu