Что означают состояния Git "спаривание нарушено" и "неизвестно", и когда они возникают?

Некоторые варианты в git diff, например --name-status, вызвать вывод буквы состояния рядом с именем файла. Они есть:

A, C, D, M, R, T, U, X, B

... и они имеют в виду

Добавлен (A), Скопирован (C), Удален (D), Изменен (M), Переименован (R), изменен тип (т. Е. Обычный файл, символическая ссылка, подмодуль,…) (T), Unmerged (U), Неизвестен (X)), или спаривание сломано (B).

Вопрос: как следует X а также B статусы должны быть истолкованы, и какие обстоятельства приводят к их появлению? Можете ли вы предоставить ряд шагов, приводящих к появлению таких статусов в выходных данных git-diffи, возможно, способы их исправить?

1 ответ

Решение

B Статус "сломанная пара" никогда не появляется непосредственно в --name-status вывод, это полезно только в качестве аргумента для опции --diff-filter когда также используется опция -B (--break-rewrites). Используя его в качестве фильтра, вы выбираете файлы, у которых по крайней мере определенный процент их содержимого удален или изменен.

Этот "взлом" не очень полезен для --name-status поскольку точка "прерывания" в основном заключается в изменении способа генерации текста различий: он исключает контекстные строки (неизмененные строки) из вывода различий, а не генерирует строки добавления и удаления, которые потребовались бы вокруг любых "случайных" общих подпоследовательностей. Алгоритм сравнения случайно нашел.

git init broken-pairs
cd broken-pairs
nums() { seq "$1" "$2" 2>/dev/null || jot $(($2 - $1 + 1)) "$1"; }
nums   0  99 > a
nums 100 199 > b
git add a b
git commit -ma=0-99,b=100-199
nums 200 299 > a
{ nums 100 149; nums 350 399; } > b
git diff --name-status --diff-filter=B             # selects nothing
git diff --name-status --diff-filter=B -B          #         M100    a
git diff --name-status --diff-filter=B -B/50       #         M100    a M050    b

X "Неизвестный" статус никогда не должен появляться. Если он появляется, это означает, что имя пути, которое не является ни неотделенным, ни добавленным, ни удаленным, ни измененным или не изменило его тип (эффективно: без изменений), неожиданно превратило его в ядро ​​внутреннего механизма сравнения; Ошибка feeding unmodified <pathname> to diffcore также будет создан.

Похоже, что осталось от какого-то старого режима работы.

Другие вопросы по тегам