是否可以让所有“git diff”命令在所有git项目中使用“Python diff”?

14 投票
3 回答
1683 浏览
提问于 2025-04-15 22:27

当你在本地的 .gitattributes 文件中加入这一行

*.py diff=python

之后,使用 git diff 命令时,Python 文件的不同修改部分会显示出很好的标签,比如修改发生在哪个函数等。

那么,有没有办法让 git 在所有的 git 项目中对所有 Python 文件都使用这种差异模式呢?我试着设置了一个全局的 ~/.gitattributes 文件,但本地的 git 仓库并没有使用它。有没有比每次新建 git 项目时都用 ln -s ~/.gitattributes 更方便的方法呢?

3 个回答

0

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

3

要让git使用~/.gitattributes这个文件,你需要在~/.gitconfig文件里加上这一行:

[core]
  attributesfile = ~/.gitattributes
4

引用自 gitattributes(5):

对于单个用户来说,应该影响所有仓库的属性应该放在一个文件里,这个文件由 core.attributesfile 配置选项指定(见 git-config(1))。默认情况下,这个文件的位置是 $XDG_CONFIG_HOME/git/attributes。如果 $XDG_CONFIG_HOME 没有设置或者是空的,就会使用 $HOME/.config/git/attributes。系统上所有用户的属性应该放在 $(prefix)/etc/gitattributes 文件中。

总结一下: echo '*.py diff=python' >> "${XDG_CONFIG_HOME:-$HOME/.config}"/git/attributes


更新,7年后

好吧,其实不需要为 *.py 文件配置 diff=python,因为这个早就已经是默认设置了。

不过,主要的观点还是成立的:你在本地(每个仓库)可以设置的 .gitattributes,也可以设置为全局(每台机器)。

man 5 gitattributes 里有很多很好的例子,所以 去看看文档。

我们来做一个自定义设置:--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

就这样!测试一下吧。

撰写回答