从命令行覆盖.gitattributes

时间:2019-01-07 03:40:57

标签: git vim diff gitattributes

是否有任何方法可以临时覆盖git中的属性,类似于可以使用-c覆盖配置选项吗?

我想使用特定的自定义git diff命令调用textconv,该命令不同于我通常使用的命令。

更具体地讲:我的实际用例是使用jupytext.vim plugin在vim中编辑Jupyter笔记本。

我的普通~/.gitconfig包含

[diff "jupyternotebook"]
    command = git-nbdiffdriver diff

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

*.ipynb diff=jupyternotebook

现在我想拥有

[diff "jupytext"]
    textconv = jupytext --from=ipynb --to=md -o - <

(或类似的东西)在git配置中,并让git diff

*.ipynb diff=jupytext

位于.gitattributes中。

我愿意将[diff "jupytext"]部分永久添加到我的~/.gitconfig中。但是,根据传递给git diff的命令行选项,使用临时驱动程序而不是默认的“ jupyternotebook”必须是临时的。

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

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

1 个答案:

答案 0 :(得分:0)

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

在我的 cat 中,我有:

~/.config/git/attributes

在我的 * diff=default 中,我有:

~/.gitconfig

以及这个别名,让我在需要时通过调用 [diff "default"] textconv = cat [diff "cat"] textconv = cat [diff "nonums"] textconv = "f(){ gsed -E 's/[0-9]+/##/g' \"$1\" ; }; f" 暂时覆盖默认情况。 (别名允许 git diff-nonums 允许的任何参数。)

git diff

对于您的情况,我认为您希望使用 difftool 而不是 diff 的 [alias] diff-nonums = !git -c diff.default.textconv=\"`git config diff.nonums.textconv`\" diff 配置来切换实际命令。 The nbdime docs 表明他们提供了一个脚本来编写所需的配置(command,然后可以使用 git-nbdifftool config --enable [--global]) 这样做之后,我相信您可以设置默认+别名技巧来切换两者工具和 textconv 来完成您对 nbdiff 或 jupytext 的需求。

(有关可以保存属性文件的位置,请参阅 git difftool --tool=nbdime 后面的几段。注意,我不清楚 man gitattributescommand 和 { {1}}。例如,我刚才没有找到一个简单的方法来获取外部或命令来使用 git 本身。)

edit 我从 this question 看到 git 主要是想让你在 textconv 和外部命令之间进行选择,而不是 mix/chain(不幸的是)。即,external 中的部分称为“选择 textconv 与外部差异”。链接的问题建议使用临时文件的解决方法。