Подтвердить что ты не робот

В чем причина префиксов /a/b от git diff

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

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

4b9b3361

Ответ 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