Пример diff, возвращающего перезапись файла

#git

#git

Вопрос:

В документации для git diff-format говорится следующее относительно изменений на месте:

За буквой статуса M может следовать оценка (обозначающая процент несоответствия) для перезаписи файла.

но никакого примера сказанного не приведено.

Что такое перезапись файла и чем она отличается от модификации файла?

Можете ли вы привести пример diff, возвращающего запись для перезаписи файла с некоторым процентом различий, например

:100644 100644 5be4a4a fabadb8 M050 file.c

где M050 означает 50% различия?

Спасибо

Ответ №1:

Давайте рассмотрим тестовый пример git rewrite, чтобы получить% различий.

  1. Загрузите образец содержимого из git,
    wget -O test https://raw.githubusercontent.com/git/git/master/COPYING
  2. git add test; git commit -m"initial commit"
  3. Замените небольшое содержимое файла,
 head -230 test | tr "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" > test.tmp
tail -130 test >> test.tmp
cat test.tmp > test
  
  1. git diff -B --raw test
 :100644 100644 536e555 0000000 M063     test
  
  1. Во время фиксации файл будет помечен как перезаписанный.
 git add test
git commit -m"commit 60percent"
[master 59c06d0] commit 60percent
 1 file changed, 360 insertions( ), 360 deletions(-)
 rewrite test (63%)
  

Согласно опции git diff -B, если более 40% файла не изменено, это не будет считаться перезаписью. Вам нужно передать параметры в git diff, чтобы получить 50% различия.

 git reset --hard HEAD~1
head -186 test | tr "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" > test.tmp
tail -174 test >> test.tmp
cat test.tmp > test
  
 git diff --raw -B/50
:100644 100644 536e555 0000000 M050     test
  

Однако при фиксации файла он не будет считаться перезаписью

 git add test
git commit -m"commit 50percent"
[master 89aa4a6] commit 50percent
 1 file changed, 177 insertions( ), 177 deletions(-)
  

Комментарии:

1. Я только что обнаружил, что с -B опцией буква статуса T (означающая изменение типа) поставляется с индексом различия в форме Tnnn . До сих пор я видел только T100 , даже после перехода с символической ссылки file.txt -> f.txt на содержимое file.txt with this is f.txt .

2. Я видел выше, используя git версии 2.28.0

3. @mljrg, странно, что он печатает индекс для изменения типа. Я не думаю, что мы получим какое-либо значение, отличное от 100, для изменения типа. Интересно, что в документации нет упоминания о том, является ли это индексом различия или сходства.

4. Да, в документации об этом ничего не говорится. Кроме того, значения сходства / различия всегда отображаются в виде трех цифр в выходных данных, а в документации отображаются только две цифры, когда они ниже 100%. Вероятно, что-то нужно исправить, либо код, либо документы.