Предположим, следующая конфигурация:

$ cat ~/.ssh/config
Host foo
HostName git.foo.com
IdentityFile ~/.ssh/foo
Port 9000
User git
$ cd WORKING_COPY
$ git remote -v
origin  foo:bla.git (fetch)
origin  foo:bla.git (push)

Что мерзавец субкоманда можно использовать, в папке WORKING_COPY чтобы решить реальные URL origin удаленной (то есть git+ssh://git@git.foo.com:9000/bla.git

1 ответ1

1

Что касается Git, то это настоящий URL. git remote -v и git remote get-url выполняют только подстановки, определенные в собственной конфигурации Git (т.е. url.*.insteadOf настройки). Остальное передается напрямую клиенту SSH.

Поэтому вам нужно либо разобрать ~/.ssh/config самостоятельно, либо как-то спросить программу ssh . Последние версии OpenSSH имеют опцию -G для этого:

$ ssh -G foo | egrep "^(user|hostname|port) "
user git
hostname git.foo.com
port 9000

$ ssh -G foo | perl -e 'while (<>) { /^(\S+) (.*)$/ and $c{$1} = $2; }
                        for ($c{hostname}) { /:/ and s/.*/[$&]/; }
                        print "ssh://$c{user}\@$c{hostname}:$c{port}/\n";'
ssh://git@git.foo.com:9000/

(Префиксы git+ssh:// и ssh+git:// запланированы для удаления из git.)

Для более старых версий, у которых нет прямой опции для этого; возможно, вы могли бы злоупотребить его опцией ProxyCommand (это то, что делает Mosh) или LocalCommand, если вы не возражаете против его фактического подключения к серверу:

ssh -o ProxyCommand=">&2; echo %h %p" foo

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .