Эти префиксы каталога существуют в основном для совместимости и выбраны в качестве разумных значений по умолчанию.Объяснение следующее.
Перед git
Перед git (и другими VCS ) рабочий процесс для создания исправления для нескольких файлов мог бы быть, например, следующим:
- Допустим, у вас есть исходный код проекта
asdf
в каталоге asdf-source.latest
. - Вы копируете каталог в новый каталог (например,
asdf-source.new
, в идеале жесткие ссылки файлы внутри). - Теперь вы можете внести все свои изменения в
asdf-source.new
, попробовать скомпилировать код, протестировать его и т. Д. - Послевсе готово, вы создаете патч, например,
diff -r asdf-source.latest asdf-source.new >new_feature.patch
.Выход развивался во времени.Помимо прочего, git по умолчанию использует «унифицированный» вывод, который может быть получен с использованием параметра -u
diff.
Теперь вы можете видеть, что в патче есть пути к измененным файлам с использованием имен каталогов..
Человек (или сценарий сборки и т. Д.), Применяющий ваш патч, будет использовать patch
вместо git apply
или git am
.Чтобы команда нашла подходящие файлы, имя каталога должно быть удалено из пути с помощью опции -pN
патча (N показывает количество имен каталогов и разделителей, которые нужно удалить).В приведенном выше случае используемая команда может быть patch -p1 <new_feature.patch
.Это позволяет создателю патча использовать его / ее собственные имена каталогов.
Если вы когда-либо сталкивались со скриптом, исправляющим какой-либо проект с использованием большого количества патчей (обычно используется для back-ported например, исправления для стабильных версий пакетов в дистрибутивах Linux), исправления могут различаться по формату.Команда patch
способна правильно определять эти форматы, но с путями это немного сложнее (сколько каталогов удалить).Некоторые проблемы с этим:
- Заставлять разработчиков использовать 0 каталогов не очень приятно.
- Поиск файла
patch
может быть опасным (так как он может найти другой файл).
Таким образом, все, кто отправляет патчи, которые можно применить с помощью patch -p1
, кажутся наиболее разумным способом.
Назад к git
Когда git былсоздан, он принял разумные значения по умолчанию (которые совместимы с большинством руководящих принципов представления проекта, в основном ядра) для таких вариантов.Благодаря этому вы можете использовать git и отправлять правильно отформатированный патч тому, кто использует patch
для его применения, и наоборот (git также может обрабатывать патчи, созданные diff
).Наличие префиксов «a» и «b», в частности, экономит место (и небольшой процент пропускной способности), сохраняя при этом все работоспособное.
Вы можете установить git config diff.mnemonicprefix true
, чтобы git использовал разные префиксы в зависимости от того, чтовы сравниваете (см. git help config
для более подробной информации).