#git
#git
Вопрос:
В документации для git diff-format говорится следующее относительно изменений на месте:
За буквой статуса M может следовать оценка (обозначающая процент несоответствия) для перезаписи файла.
но никакого примера сказанного не приведено.
Что такое перезапись файла и чем она отличается от модификации файла?
Можете ли вы привести пример diff, возвращающего запись для перезаписи файла с некоторым процентом различий, например
:100644 100644 5be4a4a fabadb8 M050 file.c
где M050
означает 50% различия?
Спасибо
Ответ №1:
Давайте рассмотрим тестовый пример git rewrite, чтобы получить% различий.
- Загрузите образец содержимого из git,
wget -O test https://raw.githubusercontent.com/git/git/master/COPYING
git add test; git commit -m"initial commit"
- Замените небольшое содержимое файла,
head -230 test | tr "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM" > test.tmp
tail -130 test >> test.tmp
cat test.tmp > test
git diff -B --raw test
:100644 100644 536e555 0000000 M063 test
- Во время фиксации файл будет помечен как перезаписанный.
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
withthis is f.txt
.2. Я видел выше, используя git версии 2.28.0
3. @mljrg, странно, что он печатает индекс для изменения типа. Я не думаю, что мы получим какое-либо значение, отличное от 100, для изменения типа. Интересно, что в документации нет упоминания о том, является ли это индексом различия или сходства.
4. Да, в документации об этом ничего не говорится. Кроме того, значения сходства / различия всегда отображаются в виде трех цифр в выходных данных, а в документации отображаются только две цифры, когда они ниже 100%. Вероятно, что-то нужно исправить, либо код, либо документы.