В чем причина префиксов / a / b в git diff? - PullRequest
52 голосов
/ 20 июля 2011

Я использую git уже несколько лет и всегда задавался вопросом, почему git diff ставит префиксы имен измененных файлов с / и b /.Я ожидал, что в итоге наткнусь на вариант использования, где он полезен, но до сих пор он всегда раздражал и никогда не помогал.

Для чего он хорош?Почему это включено по умолчанию?В каких ситуациях это полезно?

Ответы [ 5 ]

44 голосов
/ 20 июля 2011

Как упоминалось в справочной странице diff , a / et b / представляет префикс для разграничения источника и назначения.

На самом деле, у вас есть варианты:

--no-prefix

Не показывать префикс источника или назначения.

--src-prefix=<prefix>

Показывает указанный префикс источника вместо "/".

--dst-prefix=<prefix>

Показывать указанный префикс назначения вместо "b /"

27 голосов
/ 29 августа 2013

Если вы не находите это полезным, вы можете отключить его с помощью:

git config --global diff.noprefix true
14 голосов
/ 04 декабря 2013

Эти префиксы каталога существуют в основном для совместимости и выбраны в качестве разумных значений по умолчанию.Объяснение следующее.

Перед 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 для более подробной информации).

6 голосов
/ 20 июля 2011

Различать источник и пункт назначения.Вы также можете изменить его на более значимый:

- src-prefix = <prefix>

Show the given source prefix instead of "a/".

- dst-prefix = <prefix>

Show the given destination prefix instead of "b/".

http://git -scm.com / docs / git-diff

4 голосов
/ 23 ноября 2015

Если вы хотите добавить git diff --no-prefix к вашему .gitconfig вручную, просто добавьте следующее:

[diff]
noprefix = true
...