On Sat, Oct 08, 2016 at 10:36:13AM +0200, Johannes Schindelin wrote: > > > Maybe it's time to aim for > > > > > > git config alias.d2u.shell \ > > > 'f() { git ls-files "$@" | xargs dos2unix; }; f' > > > git config alias.d2u.cdup false > > > git d2u *.c # yada! > > > > That would be nice. It would also allow "alias.foo_bar.shell"; right now > > "alias.foo_bar" is forbidden because of the config syntax, which does > > not allow underscores outside of the "subsection" name. > > So what about this? > > [alias] > d2u = !dos2unix > [alias "d2u"] > shell = 'f() { git ls-files "$@" | xargs dos2unix; }; f' > exec = C:/cygwin64/bin/dos2unix.exe > > You introduce all kinds of ambiguities here that did not exist before... If you mean ambiguity between the old "alias.X" and the new "alias.X.*", then yes, I think that's an unavoidable part of the transition. IMHO, the new should take precedence over the old, and people will gradually move from one to the other. If you mean the ambiguity between alias.X.shell and alias.X.exec in your example, the problem is that you have keys with overlapping meanings. One solution is "don't do that" (so have a key like "cmd", and another to select "shell or git-cmd", etc). Another is to define some rule, like "last one wins" (so "exec" overrides "shell" in your example). I'd prefer the "don't do that" path. The config you showed is nonsensical, and it doesn't really matter that much how we behave. But it is better still if we have a config scheme that makes it hard to write nonsensical things in the first place. -Peff