Skip to content
/ git Public
forked from git/git

Commit

Permalink
Merge branch 'tq/git-ssh-command'
Browse files Browse the repository at this point in the history
Allow passing extra set of arguments when ssh is invoked to create
an encrypted & authenticated connection by introducing a new environment
variable GIT_SSH_COMMAND, whose contents is interpreted by shells.

This is not possible with existing GIT_SSH mechanism whose
invocation bypasses shells, which was designed more to match what
other programs with similar variables did, not necessarily to be
more useful.

* tq/git-ssh-command:
  git_connect: set ssh shell command in GIT_SSH_COMMAND
  • Loading branch information
gitster committed Dec 5, 2014
2 parents 05d7fb6 + 3994276 commit 09d60d7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 15 deletions.
26 changes: 14 additions & 12 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -881,19 +881,21 @@ other
and the `core.editor` option in linkgit:git-config[1].

'GIT_SSH'::
If this environment variable is set then 'git fetch'
and 'git push' will use this command instead
of 'ssh' when they need to connect to a remote system.
The '$GIT_SSH' command will be given exactly two or
four arguments: the 'username@host' (or just 'host')
from the URL and the shell command to execute on that
remote system, optionally preceded by '-p' (literally) and
the 'port' from the URL when it specifies something other
than the default SSH port.
'GIT_SSH_COMMAND'::
If either of these environment variables is set then 'git fetch'
and 'git push' will use the specified command instead of 'ssh'
when they need to connect to a remote system.
The command will be given exactly two or four arguments: the
'username@host' (or just 'host') from the URL and the shell
command to execute on that remote system, optionally preceded by
'-p' (literally) and the 'port' from the URL when it specifies
something other than the default SSH port.
+
To pass options to the program that you want to list in GIT_SSH
you will need to wrap the program and options into a shell script,
then set GIT_SSH to refer to the shell script.
`$GIT_SSH_COMMAND` takes precedence over `$GIT_SSH`, and is interpreted
by the shell, which allows additional arguments to be included.
`$GIT_SSH` on the other hand must be just the path to a program
(which can be a wrapper shell script, if additional arguments are
needed).
+
Usually it is easier to configure any desired options through your
personal `.ssh/config` file. Please consult your ssh documentation
Expand Down
15 changes: 12 additions & 3 deletions connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -700,14 +700,23 @@ struct child_process *git_connect(int fd[2], const char *url,

conn->in = conn->out = -1;
if (protocol == PROTO_SSH) {
const char *ssh = getenv("GIT_SSH");
int putty = ssh && strcasestr(ssh, "plink");
const char *ssh;
int putty;
char *ssh_host = hostandport;
const char *port = NULL;
get_host_and_port(&ssh_host, &port);
port = get_port_numeric(port);

if (!ssh) ssh = "ssh";
ssh = getenv("GIT_SSH_COMMAND");
if (ssh) {
conn->use_shell = 1;
putty = 0;
} else {
ssh = getenv("GIT_SSH");
if (!ssh)
ssh = "ssh";
putty = !!strcasestr(ssh, "plink");
}

argv_array_push(&conn->args, ssh);
if (putty && !strcasestr(ssh, "tortoiseplink"))
Expand Down

3 comments on commit 09d60d7

@dolmen
Copy link

@dolmen dolmen commented on 09d60d7 Feb 11, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you need this option to use different SSH options (such as using another identity file), you can also set those options per host in your ~/.ssh/config. github-keygen uses this to easily use multiple Github identities.

@sharyuke
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if i use both GIT_SSH_COMMAND and ~/.ssh/config, which one will work ?
@dolmen

@dolmen
Copy link

@dolmen dolmen commented on 09d60d7 Feb 25, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sharyuke It depends on what you put in GIT_SSH_COMMAND: if you use ssh (from OpenSSH) from GIT_SSH_COMMAND, ~/.ssh/config will also be used.

Please sign in to comment.