Возможно ли, чтобы все команды git diff использовали Python diff во всех проектах git?

При включении строки

*.py diff=python

в локальном файле .gitattributes git diff создает красивые метки для различных блоков различий файлов Python (с именем функции, в которой происходят изменения, и т. д.).

Можно ли попросить git использовать этот режим сравнения для всех файлов Python во всех проектах git? Я попытался установить глобальный ~ / .gitattributes, но он не используется локальными репозиториями git. Есть ли более удобный метод, чем инициализировать каждый новый проект git с помощью ln -s ~/.gitattributes?


person Eric O Lebigot    schedule 07.05.2010    source источник


Ответы (3)


Цитата из gitattributes(5):

Атрибуты, которые должны влиять на все репозитории для одного пользователя, должны быть помещены в файл, указанный в параметре конфигурации core.attributesfile (см. Git-config (1)). Его значение по умолчанию - $ XDG_CONFIG_HOME / git / attributes. Если $ XDG_CONFIG_HOME не задан или пуст, вместо него используются атрибуты $ HOME / .config / git /. Атрибуты для всех пользователей системы должны быть помещены в файл $ (prefix) / etc / gitattributes.

TL; DR: echo '*.py diff=python' >> "${XDG_CONFIG_HOME:-$HOME/.config}"/git/attributes


Обновление, 7 лет спустя

Хорошо, настраивать diff=python для файлов * .py необязательно - это давно по умолчанию.

Но общий момент остается: все, что вы можете настроить в локальном (для каждого репозитория) .gitattributes, вы также можете сделать глобальным (для каждого компьютера).

В самом man 5 gitattributes есть много хороших примеров, поэтому пожалуйста иди в RTFM.

Давайте сделаем только одну индивидуальную настройку: --word-diff для всех файлов Markdown (спасибо @RayLuo за предложение этого в комментариях).

Сначала мы добавляем внешний драйвер сравнения:

git config --global diff.stackoverflow-word-diff.command ~/.local/bin/stackoverflow-word-diff

API таков, что мы должны сделать автономный исполняемый файл оболочки.

cat > ~/.local/bin/stackoverflow-word-diff << 'EOF'
#!/bin/bash -eu

#-- uncomment for debug:
#echo >&2 "$(basename $0) args: $@"; set -x

FILENAME="$1"
OLDFILE="$2"
OLDHASH="$3"
OLDMODE="$4"
NEWFILE="$5"
NEWHASH="$6"
NEWMODE="$7"

git diff --no-ext-diff --word-diff "$OLDFILE" "$NEWFILE" || exit 0

#-- from https://stackoverflow.com/a/18948381/531179
#-- see `man 1 git` /EXTERNAL_DIFF, or https://www.git-scm.com/docs/git
EOF
chmod +x ~/.local/bin/stackoverflow-word-diff

Наконец, мы связываем это с *.md, *.markdown через глобальные атрибуты gitattributes:

mkdir -vp "${XDG_CONFIG_HOME:-$HOME/.config}"/git

{ echo '*.md diff=stackoverflow-word-diff'; \
  echo '*.markdown diff=stackoverflow-word-diff; \
} \
    >> "${XDG_CONFIG_HOME:-$HOME/.config}"/git/attributes

И это все, ребята! Попробуй это.

person ulidtko    schedule 22.09.2013
comment
Это работает (с git 1.8.4), спасибо! Кажется, что *.py diff=python теперь фактически является значением по умолчанию, поэтому конкретный случай моего исходного вопроса, похоже, больше не актуален. Приятно знать, что в любом случае существует файл атрибутов пользовательского уровня! - person Eric O Lebigot; 23.09.2013
comment
Как отметил @EricOLebigot, этот параметр не имеет ощутимого эффекта, что, вероятно, связано с тем, что это поведение *.py diff=python уже является значением по умолчанию. Итак, как, если это вообще возможно, мы можем дополнительно настроить параметры различий? Например, git diff --word-diff ... ... было бы интересной попыткой. Как мы можем объявить это в нашей настройке, в идеале для файлов разметки? - person RayLuo; 21.04.2020
comment
Привет, @RayLuo, спасибо за предложение! Я добавил способ добиться этого. Извините, это заняло так много времени; StackOverflow полностью потерял почти готовый предыдущий черновик во время перезапуска браузера. Надеюсь, это поможет! - person ulidtko; 28.04.2020
comment
@ulidtko Вы так любезны, что потратили немало времени на то, чтобы найти решение этой проблемы с различием слов! Спасибо! Ваше новое решение почти работает, оно может генерировать ожидаемый --word-diff результат. Однако в конце результата сравнения всегда есть одна строка с надписью fatal: external diff died, stopping at TheFirstDifferentFile.md. И тогда другие мои измененные файлы не будут различаться. Это даже эффективно нарушает некоторые другие функции git, которые зависят от поведения diff. Я запускаю bash в Linux на базе Debian. Почему моя попытка не работает? - person RayLuo; 03.05.2020
comment
Ах, черт возьми. @RayLuo Я тоже это видел, но не мог понять. При втором взгляде становится до неловкости ясно: это мой set -e обратный эффект. Просто нужно добавить _2 _... Через минуту обновлюсь. - person ulidtko; 05.05.2020

Чтобы указать git использовать ~ / .gitattributes, вам нужно поместить это в ~ / .gitconfig:

[core]
  attributesfile = ~/.gitattributes
person sickill    schedule 18.12.2011
comment
+1. Спасибо. Это интересно, но разве это не препятствует использованию локальных атрибутов .gitattributes для локальных настроек? Мне было интересно, можно ли иметь некоторые атрибуты, общие для всех проектов, которые можно было бы настраивать локально. - person Eric O Lebigot; 19.12.2011
comment
@EricOLebigot Это НЕ отменяет локальные настройки. Репо-локальные атрибуты имеют приоритет над глобальными и общесистемными атрибутами. Приоритет локальных файлов .gitattributes зависит от их удаленности от рассматриваемого пути. См. git-scm.com/docs/gitattributes. - person DylanYoung; 20.07.2020

Нет, git ищет атрибуты только локально: .gitattributes и .git/info/attributes

person Oblomov    schedule 07.05.2010