是否可以让所有“git diff”命令在所有git项目中使用“Python diff”?
当你在本地的 .gitattributes 文件中加入这一行
*.py diff=python
之后,使用 git diff
命令时,Python 文件的不同修改部分会显示出很好的标签,比如修改发生在哪个函数等。
那么,有没有办法让 git 在所有的 git 项目中对所有 Python 文件都使用这种差异模式呢?我试着设置了一个全局的 ~/.gitattributes 文件,但本地的 git 仓库并没有使用它。有没有比每次新建 git 项目时都用 ln -s ~/.gitattributes
更方便的方法呢?
3 个回答
不,git 只会在本地查找属性:.gitattributes
和 .git/info/attributes
要让git使用~/.gitattributes这个文件,你需要在~/.gitconfig文件里加上这一行:
[core]
attributesfile = ~/.gitattributes
引用自 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
就这样!测试一下吧。