Is there any way to temporarily override attributes in git, similarly to how -c can be used to override config options?
I would like to call git diff with a specific custom textconv command different from the one I normally use.
To make this more concrete: My actual use case is for Jupyter notebooks being edited in vim with the jupytext.vim plugin.
My normal ~/.gitconfig contains
[diff "jupyternotebook"]
command = git-nbdiffdriver diff
that sets up nbdime as a diff driver, and then in ~/.gitattributes:
*.ipynb diff=jupyternotebook
Now I'd like to have
[diff "jupytext"]
textconv = jupytext --from=ipynb --to=md -o - <
(or something like that) in the git config, and have git diff act as if
*.ipynb diff=jupytext
was in .gitattributes.
I'd be open to adding the [diff "jupytext"] section permanently to my ~/.gitconfig. However, using the "jupytext" driver instead of the default "jupyternotebook" must be temporary, based on a command line option passed to git diff.
Alternatively, I'd be OK with a command line option to git diff that forces it to use a different ~/.gitattributes file that takes precedence over all other .gitattributes files (e.g. in the same directory).
Ultimately, the command line option is intended to go into the g:gitgutter_diff_args setting of vim-gitgutter. I want to force the plugin to convert *.ipynb files differently from the way I would normally want to convert them with nbdime.
I had a similar case where I wanted to switch a textconv filter on and off per run, rather than by file extension. (I wanted to be able check sometimes if there are any changes that are not just a numeric change from one value to another.) The trick I found was to create a "default" case, which is always used, using cat for the textconv, and which I could then reassign with -c.
In my ~/.config/git/attributes I have:
* diff=default
In my ~/.gitconfig I have:
[diff "default"]
textconv = cat
[diff "cat"]
textconv = cat
[diff "nonums"]
textconv = "f(){ gsed -E 's/[0-9]+/##/g' \"$1\" ; }; f"
As well as this alias, letting me temporarily override the default case when desired by calling git diff-nonums. (The alias allows any arguments that git diff allows.)
[alias]
diff-nonums = !git -c diff.default.textconv=\"`git config diff.nonums.textconv`\" diff
For your case, I think you'd want to use difftool, rather than diff's command configuration, to toggle the actual command. The nbdime docs show they provide a script to write the needed configs (git-nbdifftool config --enable [--global], and then can use git difftool --tool=nbdime) Having done that, I believe you could set up the default+alias trick to switch both the tool and textconv to do what you need for either nbdiff or jupytext.
(See man gitattributes, a few paragraphs down, for places where the attributes file may be saved. Note, I'm unclear about the difference between command, external, and difftool. For instance, I didn't find an easy way just now to get external or command to use git itself.)
edit I see from this question that git largely intends you to choose between textconv versus external commands, rather than mix/chain (unfortunately). I.e., the section in man gitconfig is called "Choosing textconv versus external diff". The linked question suggests a workaround with temporary files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With