Subject: Re: How to see command line arguments passed to program in core.sshcommand?

From: SZEDER Gábor <[email-masked]>
Date: Mon, 23 Sep 2019 20:38:06 +0200

On Mon, Sep 23, 2019 at 01:18:39PM -0400, Jeffrey Walton wrote:
> (A) core.sshCommand:
> 
>     sshcommand = "C:\\Users\\Jeffrey Walton\\Desktop\\test_tunnel.exe"
> 
> Result:
> 
> $ GIT_TRACE=1 git clone ssh://[email-masked]:22480/main
> ...
> Cloning into 'main'...
> 11:44:32.192382 run-command.c:663       trace: run_command: unset
> GIT_DIR; 'C:\Users\Jeffrey Walton\Desktop\test_tunnel.exe' -p 22480
> [email-masked] 'git-upload-pack '\''/main'\'''
> C:\Users\Jeffrey Walton\Desktop\test_tunnel.exe: C:UsersJeffrey:
> command not found
> fatal: Could not read from remote repository.
> 
> =====
> 
> (B) core.sshCommand:
> 
>     sshcommand = "C:\\\\Users\\\\Jeffrey Walton\\\\Desktop\\\\test_tunnel.exe"
> 
> Result:
> 
> $ GIT_TRACE=1 git clone ssh://[email-masked]:22480/main
> ...
> Cloning into 'main'...
> 11:45:59.161132 run-command.c:663       trace: run_command: unset
> GIT_DIR; 'C:\\Users\\Jeffrey Walton\\Desktop\\test_tunnel.exe' -p
> 22480 [email-masked] 'git-upload-pack '\''/main'\'''
> C:\\Users\\Jeffrey Walton\\Desktop\\test_tunnel.exe: C:\Users\Jeffrey:
> No such file or directory
> fatal: Could not read from remote repository.
> 
> =====
> 
> (C) core.sshCommand:
> 
>     sshcommand = "C:\\\\Users\\\\JEFFRE~1\\\\Desktop\\\\TEST_T~1.EXE"
> 
> Result:
> 
> $ GIT_TRACE=1 git clone ssh://[email-masked]:22480/main
> ...
> Cloning into 'main'...
> 11:47:49.973632 run-command.c:663       trace: run_command: unset
> GIT_DIR; 'C:\\Users\\JEFFRE~1\\Desktop\\TEST_T~1.EXE' -p 22480
> [email-masked] 'git-upload-pack '\''/main'\'''
> Arg 1: 'C:\Users\JEFFRE~1\Desktop\TEST_T~1.EXE'
> Arg 2: '-p'
> fArg 3: '22480'
> atal: pArg 4: [email-masked]'
> rotocol error:Arg 5: 'git-upload-pack '/main''
>  bad line length character: Test
> 
> =====
> 
> (A) is stripping quotes but they are needed for Windows long file
> names. (A) also seems to be double-escaping slashes.
> 
> (B) is also stripping quotes. (B) works around the double-escaping slashes.
> 
> (C) works around stripping quotes by using short filenames. (C) also
> works around the double-escaping slashes.
> 
> I did not find a git-path or git-filename man page. Most of this
> appear undocumented (to me).
> 
> From a usability point of view, Windows long filenames have been
> around since at least 1995. This is how Windows users expect things to
> work for the last couple of decades:
> 
>     shcommand = "C:\Users\Jeffrey Walton\Desktop\test_tunnel.exe"
> 
> or
> 
>     shcommand = "C:\\Users\\Jeffrey Walton\\Desktop\\test_tunnel.exe"
> 
> In contrast, this would not need quotes:
> 
>     shcommand = C:\Users\Jeff\Desktop\test_tunnel.exe

Git's configuration file format allows optional double quotes around
the values of configuration variables.  Consequently all double quotes
in your examples above are treated as part of the file format and are
removed; you have to escape them if you want to keep them:

  [foo]
        one = "inside double quotes"
        two = \"need those double quotes\"
        three = "\"need these double quotes, too\""

  $ git config --get foo.one
  inside double quotes
  $ git config --get foo.two
  "need those double quotes"
  $ git config --get foo.three
  "need these double quotes, too"

> If there is extra work to be done, then I think the program should do
> it, not the user. I believe Git should preserve the quotes in a long
> filename.
> 
> A fallback is to call GetShortPathName, but it is an incomplete
> remediation because short name aliases can be turned off. If short
> filenames were disabled on my system then the workaround would not
> work.
> 
> Jeff