14

When including the line

*.py diff=python

in a local .gitattributes file, git diff produces nice labels for the different diff hunks of Python files (with the name of the function where the changes are, etc.).

Is is possible to ask git to use this diff mode for all Python files across all git projects? I tried to set a global ~/.gitattributes, but it is not used by local git repositories. Is there a more convenient method than initializing each new git project with a ln -s ~/.gitattributes?

4

3 回答 3

4

引自gitattributes(5)

应该影响单个用户的所有存储库的属性应该放在由 core.attributesfile 配置选项指定的文件中(请参阅 git-config(1))。它的默认值为 $XDG_CONFIG_HOME/git/attributes。如果 $XDG_CONFIG_HOME 未设置或为空,则使用 $HOME/.config/git/attributes 代替。系统上所有用户的属性都应该放在 $(prefix)/etc/gitattributes 文件中。

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


7年后更新

好的,没有必要diff=python为 *.py 文件配置 - 这是很久以前的默认设置。

但总体要点仍然存在:您可以在本地 (per-repository) 中设置的任何内容.gitattributes,也可以在全局 (per-machine) 中设置。

本身就有很多很好的例子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

最后,我们通过全局 gitattributes将其绑定到*.md*.markdown

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

这就是所有人!测试一下。

于 2013-09-22T20:21:55.627 回答
3

要告诉 git 使用 ~/.gitattributes 你需要把它放在 ~/.gitconfig 中:

[core]
  attributesfile = ~/.gitattributes
于 2011-12-18T18:22:15.743 回答
0

不,git 只在本地查找属性:.gitattributes.git/info/attributes

于 2010-05-07T15:30:13.320 回答