【问题标题】:Is it possible to have all "git diff" commands use the "Python diff", in all git projects?是否可以在所有 git 项目中让所有“git diff”命令都使用“Python diff”?
【发布时间】:2010-05-07 12:55:43
【问题描述】:

当包含行时

*.py diff=python

在本地 .gitattributes 文件中,git diff 为 Python 文件的不同差异块生成漂亮的标签(带有更改所在函数的名称等)。

是否可以要求 git 对 all git 项目中的 all Python 文件使用这种差异模式?我尝试设置一个全局 ~/.gitattributes,但本地 git 存储库不使用它。有没有比用ln -s ~/.gitattributes初始化每个新的git项目更方便的方法?

【问题讨论】:

    标签: python git diff gitattributes


    【解决方案1】:

    引用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


    7 年后更新

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

    但总体要点仍然存在:您可以在本地(每个存储库).gitattributes 中设置任何内容,也可以设置为全局(每个机器)。

    man 5 gitattributes 本身就有很多很好的例子,所以去 RTFM。

    让我们只做一个自定义设置:--word-diff 用于所有 Markdown 文件(感谢 @RayLuo 在 cmets 中提出的建议)。

    首先,我们添加一个外部差异驱动程序:

    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
    

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

    【讨论】:

    • 这有效(使用 git 1.8.4),谢谢!不过,*.py diff=python 似乎现在实际上是默认值,所以我原来的问题的特殊情况似乎不再相关。很高兴知道有一个用户级别的属性文件,无论如何!
    • 正如@EricOLebigot 指出的那样,这个设置没有明显的效果,这可能是因为*.py diff=python 的行为已经是默认的了。那么,如果可能的话,我们如何进一步自定义差异选项?例如,git diff --word-diff ... ... 将是一个有趣的尝试。我们如何在我们的设置中声明它,理想情况下用于降价文件?
    • 嘿@RayLuo,谢谢你的建议!我添加了一种方法来实现这一点。抱歉花了这么长时间;在浏览器重新启动期间,StackOverflow 完全丢失了几乎准备好的先前草稿。希望有帮助!
    • @ulidtko 你真好,花了不少时间来为这个单词差异挑战制定解决方案!谢谢!您的新解决方案几乎可以正常工作,它可以生成预期的--word-diff 输出。然而,在差异结果的末尾,总是有一行写着fatal: external diff died, stopping at TheFirstDifferentFile.md。然后我的其他更改文件将不会被差异化。这甚至有效地破坏了其他一些依赖于差异行为的 git 功能。我在基于 Debian 的 Linux 上运行 bash。为什么my attempt 不起作用?
    • 天啊。 @RayLuo 我也看到过,但无法弄清楚。再看一遍,令人尴尬的是:这是我的set -e 适得其反。只需添加|| exit 0... 将在一分钟内更新。
    【解决方案2】:

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

    [core]
      attributesfile = ~/.gitattributes
    

    【讨论】:

    • +1。谢谢。这很有趣,但这不排除使用本地 .gitattributes 进行本地设置吗?我想知道是否有可能拥有所有项目共有的一些属性,可以在本地自定义。
    • @EricOLebigot 这不会覆盖本地设置。回购本地属性优先于全局和系统范围的属性。本地 .gitattributes 文件的优先级取决于它们与相关路径的距离。见git-scm.com/docs/gitattributes
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 2021-03-04
      • 2018-09-18
      • 1970-01-01
      • 2012-11-21
      • 2015-07-26
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多