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

14

当包含以下代码行

*.py diff=python
在本地的 .gitattributes 文件中,git diff 命令可以为Python文件的不同差异块(包含变更的函数名称等信息)生成漂亮的标签。
是否可以要求 git 在所有 git 项目中对所有 Python 文件使用这种 diff 模式?我尝试设置全局的 ~/.gitattributes,但是本地的 git 存储库没有使用它。除了对每个新的 git 项目进行 ln -s ~/.gitattributes 的初始化之外,是否有更方便的方法?
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;DR: echo '*.py diff=python' >> "${XDG_CONFIG_HOME:-$HOME/.config}"/git/attributes 更新,七年后 好了,不需要为*.py文件配置diff=python——这是自很久以前的默认设置。 但是一般观点仍然存在:您可以在本地(每个存储库)的.gitattributes中设置的任何内容,也可以使其全局(每台机器)。 在man 5 gitattributes中有许多好的示例,因此请 RTFM。 让我们只做一个自定义设置:所有Markdown文件都使用--word-diff(感谢@RayLuo 在评论中提出此建议)。 首先,我们添加一个外部diff驱动程序:
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://dev59.com/K3E85IYBdhLWcg3waCxT#18948381
#-- 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

就这些啦!测试一下吧。


1
这很有效(使用git 1.8.4),谢谢!不过,似乎*.py diff=python现在是默认设置了,因此我最初提出的问题已经不相关了。无论如何,知道有一个用户级属性文件还是很好的! - Eric O. Lebigot
正如@EricOLebigot所指出的那样,这个设置没有实际效果,这可能是因为*.py diff=python行为已经是默认值了。那么,如果可能的话,我们如何进一步定制diff选项呢?例如,git diff --word-diff ... ...将是一个有趣的尝试。我们如何在我们的设置中声明它,最好是针对markdown文件? - RayLuo
嘿@RayLuo,感谢您的建议!我已经添加了一种实现方法。很抱歉花了这么长时间;在浏览器重新启动期间,StackOverflow完全丢失了一个几乎准备好的草稿。希望这有所帮助! - ulidtko
@ulidtko,你真好,花了很多时间来解决这个单词差异的挑战!谢谢!你的新解决方案几乎可以生成预期的“--word-diff”输出。然而,在差异结果的末尾,总会有一行说“fatal: external diff died, stopping at TheFirstDifferentFile.md”。然后我的其他更改文件将不会被差异化。这甚至有效地破坏了一些依赖于差异行为的其他git功能。我在基于Debian的Linux上运行bash。为什么我的尝试没有起作用? - RayLuo
1
啊,天哪。@RayLuo 我也见过这种情况,但是无法解决。第二次看时,尴尬的是:那是我的 set -e 反噬了我。只需要添加 || exit 0...一分钟后更新。 - ulidtko

3
为了告诉git使用~/.gitattributes,您需要将以下内容放入~/.gitconfig中:
[core]
  attributesfile = ~/.gitattributes

谢谢。这很有趣,但是这是否排除了使用本地.gitattributes进行本地设置的可能性?我想知道是否可以拥有一些对所有项目通用的属性,可以在本地进行自定义。 - Eric O. Lebigot
1
@EricOLebigot 这不会覆盖本地设置。仓库本地属性优先于全局和系统范围的属性。本地.gitattributes文件的优先级取决于它们与相关路径的距离。请参阅https://git-scm.com/docs/gitattributes。 - DylanYoung

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接