从命令行覆盖 .gitattributes

Mic*_*erz 6 git vim diff gitattributes

有什么办法可以临时覆盖 git 中的属性,类似于如何-c使用覆盖配置选项?

我想git diff使用与textconv我通常使用的命令不同的特定自定义命令进行调用。

更具体一点:我的实际用例是使用jupytext.vim插件在 vim 中编辑 Jupyter 笔记本。

我的正常~/.gitconfig包含

[diff "jupyternotebook"]
    command = git-nbdiffdriver diff
Run Code Online (Sandbox Code Playgroud)

设置nbdime为差异驱动程序,然后在~/.gitattributes

*.ipynb diff=jupyternotebook
Run Code Online (Sandbox Code Playgroud)

现在我想要

[diff "jupytext"]
    textconv = jupytext --from=ipynb --to=md -o - <
Run Code Online (Sandbox Code Playgroud)

(或类似的东西)在 git 配置中,并表现git diff得好像

*.ipynb diff=jupytext
Run Code Online (Sandbox Code Playgroud)

在 .gitattributes 中。

我愿意将该[diff "jupytext"]部分永久添加到我的~/.gitconfig. 但是,根据传递给git diff.

或者,我可以使用命令行选项来git diff强制它使用~/.gitattributes优先于所有其他.gitattributes文件(例如,在同一目录中)的不同文件。

最终,在命令行选项旨在进入g:gitgutter_diff_args的设置vim-gitgutter。我想强制插件以不同的方式转换 *.ipynb 文件,我通常希望使用nbdime.

Jos*_*erg 3

我有一个类似的情况,我想textconv在每次运行时打开和关闭过滤器,而不是通过文件扩展名。(我希望有时能够检查是否有任何更改,而不仅仅是从一个值到另一个值的数字更改。)我发现的技巧是创建一个“默认”情况,该情况始终用于cattextconv,然后我可以用 -c 重新分配它。

在我的~/.config/git/attributes我有:

* diff=default
Run Code Online (Sandbox Code Playgroud)

在我的~/.gitconfig我有:

[diff "default"]
      textconv = cat
[diff "cat"]
      textconv = cat
[diff "nonums"]
      textconv = "f(){ gsed -E 's/[0-9]+/##/g'  \"$1\" ; }; f"
Run Code Online (Sandbox Code Playgroud)

除了这个别名之外,我还可以在需要时通过调用 来临时覆盖默认情况git diff-nonums。(别名允许任何git diff允许的参数。)

[alias]
    diff-nonums = !git -c diff.default.textconv=\"`git config diff.nonums.textconv`\" diff
Run Code Online (Sandbox Code Playgroud)

对于您的情况,我认为您需要使用 difftool 而不是 diff 的command配置来切换实际命令。 nbdime 文档显示他们提供了一个脚本来编写所需的配置(git-nbdifftool config --enable [--global]然后可以使用git difftool --tool=nbdime)完成此操作后,我相信您可以设置 default+alias 技巧来切换工具和 textconv 来执行 nbdiff 所需的操作或 jupytext。

(请参阅man gitattributes下面的几段,了解可以保存属性文件的位置。注意,我不清楚commandexternal和之间的区别difftool。例如,我现在没有找到获取外部或命令的简单方法使用 git 本身。)

编辑我从这个问题中看到,git很大程度上想让你在textconv和外部命令之间进行选择,而不是混合/链(不幸的是)。即,中的部分man gitconfig称为“选择 textconv 与外部 diff”。链接的问题建议使用临时文件的解决方法。