В чем причина префиксов /a/b от git diff
Я использую git уже несколько лет и всегда задавался вопросом, почему git diff префикс имена модифицированных файлов с помощью/и b/. Я ожидал, что в конечном итоге наткнется на случай использования, где это полезно, но до сих пор это всегда было раздражающим и никогда не помогало.
Для чего это полезно? Почему это включено по умолчанию? В каких ситуациях это полезно?
Ответы
Ответ 1
Как упоминалось на странице diff man, a/et b/представляет префикс для различения источника и адресата.
Собственно, у вас есть варианты:
--no-prefix
Не показывать префикс источника или получателя.
--src-prefix=<prefix>
Показать префикс источника вместо "a/".
--dst-prefix=<prefix>
Показывать префикс назначения вместо "b/"
Ответ 2
Если вы не найдете его полезным, вы можете отключить его:
git config --global diff.noprefix true
Ответ 3
Эти префиксы для каталогов в основном совместимы и выбраны как разумные значения по умолчанию. Пояснение следует.
До 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 по умолчанию использует "унифицированный" вывод, который может быть получен с использованием параметра diff -u
.
Теперь вы можете увидеть, что у патча есть пути к измененным файлам, используя имена каталогов.
Лицо (или построив script и т.д.), применяя ваш патч, будет использовать patch
вместо использования git apply
или git am
. Чтобы команда могла найти нужные файлы, имя каталога должно быть удалено из пути, используя параметр patch -pN
(N показывает количество имен каталогов и разделителей для удаления). В приведенном выше случае используемая команда может быть patch -p1 <new_feature.patch
. Это позволяет создателю патча использовать свои собственные имена каталогов.
Если вы когда-нибудь сталкиваетесь с script исправлением какого-либо проекта с использованием большого количества патчей (обычно используется для back-ported патчей для стабильного пакета версии в дистрибутивах Linux), патчи могут отличаться в формате.
Команда patch
может правильно распознавать эти форматы, но это немного сложнее с путями (сколько каталогов для удаления).
Некоторые проблемы с этим:
- Принуждение разработчиков к использованию 0 каталогов не очень приятно.
- Поиск
patch
файла может быть опасным (так как он может найти другой файл).
Так что все, кто отправляет исправления, которые могут быть применены с помощью patch -p1
, кажутся наиболее разумным способом.
Вернуться к git
Когда был создан git, он принял разумные значения по умолчанию (которые совместимы с большинством руководств по представлению проектов, в основном ядро) для таких параметров. Благодаря этому вы можете использовать git и отправить правильно отформатированный патч для тех, кто использует patch
для его применения и наоборот (git способен обрабатывать diff
-созданные исправления). Имея "а" и "б" в качестве префиксов, в частности, экономит место (и небольшой процент полосы пропускания), сохраняя при этом все, что работает.
Вы можете установить git config diff.mnemonicprefix true
, чтобы git использовал разные префиксы в зависимости от того, что вы сравниваете (подробнее см. git help config
).
Ответ 4
Он должен различать источник и назначение. Вы также можете изменить его, чтобы быть более значимым:
- SRC-префикс = <prefix>
Show the given source prefix instead of "a/".
- ДСТ-префикс = <prefix>
Show the given destination prefix instead of "b/".
http://git-scm.com/docs/git-diff
Ответ 5
Если вы хотите добавить git diff --no-prefix
в свой .gitconfig вручную, просто добавьте следующее:
[diff]
noprefix = true