Что означают состояния 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
также будет создан.
Похоже, что осталось от какого-то старого режима работы.