在 Windows 版 Git 中使用 GIT_SSH_COMMAND
Posted
技术标签:
【中文标题】在 Windows 版 Git 中使用 GIT_SSH_COMMAND【英文标题】:Using GIT_SSH_COMMAND in Git for Windows 【发布时间】:2015-10-07 03:56:42 【问题描述】:我现在正在使用 Git for Windows 2.x 的第四个候选版本,并在 shell 中使用 GIT_SSH_COMMAND 来避免 SSH 的主机验证。 在 Git Bash 我写了这样的东西:
$ GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git push origin master
如何在 Windows cmd 中执行此类操作?在任何地方都找不到任何答案。
【问题讨论】:
【参考方案1】:答案如下:
set GIT_SSH_COMMAND=ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no & git push origin master
【讨论】:
错误:The ampersand (&) character is not allowed. The & operator is reserved for future use; wrap an ampersand in double quotation marks ("&") to pass it as part of a string
@Matt - 你在 Windows 上吗? & 符号加入 windows shell 命令,在 linux 上你对行终止符(分号)做同样的事情。【参考方案2】:
您不必再在 Windows 中设置环境变量了。
使用 git 2.10+(2016 年第三季度),您还可以为 GIT_SSH_COMMAND
设置 config,这比环境变量更容易(可以全局设置,也可以在本地设置一个特定的回购)
参见Nguyễn Thái Ngọc Duy (pclouds
)commit 3c8ede3(2016 年 6 月 26 日)。(由 Junio C Hamano -- gitster
-- 合并于 commit dc21164,2016 年 7 月 19 日)
一个新的配置变量
core.sshCommand
已添加到 指定每个存储库使用的 GIT_SSH_COMMAND 值。
core.sshCommand:
如果设置了此变量,
git fetch
和git push
在需要连接到远程系统时将使用指定的命令而不是ssh
。 该命令与GIT_SSH_COMMAND
环境变量的形式相同,并在设置环境变量时被覆盖。
这意味着git push
可以是:
cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
# later on
git push origin master
在 Git 2.16(2018 年第一季度)中,您将有一个新的机制来升级现有的有线协议,并证明它可以与旧版本的 Git 一起工作而不会损害它们。
请参阅commit 6464679(2017 年 10 月 16 日)和 Jonathan Tan (jhowtan
)commit 0cd8328(2017 年 9 月 26 日)。
请参阅commit 94b8ae5、commit 3c88ebd、commit 19113a2、commit 0c2f0d2、commit 2609043、commit aa9bab2、commit dfe422d、commit 373d70e、commit 5d2124b(2017 年 10 月 16 日)@987654@987654。 sup>(由Junio C Hamano -- gitster
-- 合并于commit 4c6dad0,2017 年 12 月 6 日)
ssh
:引入一个 'simple
' ssh 变体使用“
ssh
”传输时,“-o
”选项用于指定 应在远程端设置的环境变量。 这允许 Git 在联系服务器时发送附加信息, 通过请求使用不同的协议版本 'GIT_PROTOCOL
' 环境变量像这样:“-o SendEnv=GIT_PROTOCOL
”。不幸的是,并非所有 ssh 变体都支持环境发送 变量到远程端。 考虑到这一点,仅对符合 OpenSSH 的 ssh 变体使用“
-o
”选项。 这是通过检查 ssh 命令的基本名称是否为“ssh
”或 ssh 变体被覆盖为“ssh
”(通过ssh.variant
配置)来完成的。“
-p
”和“-P
”等其他选项,用于指定特定的 要使用的端口,或“-4
”和“-6
”,用于指示 IPV4 或 应该使用IPV6地址,也可能不是所有ssh都支持 变种。目前,如果 ssh 命令的基本名称不是 '
plink
' 或 'tortoiseplink
',Git 假定该命令是 OpenSSH 变体。 由于用户配置的 ssh 命令可能不兼容 OpenSSH,因此请收紧 这个约束并假设 'simple
' 命令与 Git 已知的变体不匹配。 新的 ssh 变体“simple
”只会将要执行的主机和命令([username@]host
命令)作为参数传递给ssh
命令。
【讨论】:
从 cmd.exe 使用 git 怎么样? Git 只是不知道“git config core.sshCommand” @Ezh 为什么?你的 Git 版本是多少?您应该设置要使用的 ssh 命令,例如git config core.sshCommand "ssh -i /path/to/my/private/key"
(git config core.sshCommand
只会返回值集)
如果您从 cmd.exe 环境运行“git config core.sshCommand ...”,最新的 git (2.21) 会返回错误。从 bash 运行时它可以正常工作,但不能从 cmd.exe 运行
它显示“用法:git config [git config core.sshCommand "a command"
:它工作得很好,使用 git 版本 2.21.0.windows.1【参考方案3】:
有一种实现目标的更好方法。虽然问题和各种答案都很有趣且具有启发性,但实现目标的最佳方式并不涉及 GIT_SSH_COMMAND 变量。
不是将信息放入“git”,而是将信息放入“ssh”。
“ssh”命令在 Unix/Linux 中一直有一个“config”文件。至少在最近几年,Windows 也提供了这种功能。配置“ssh”了解你的身份文件,然后当你去执行“git clone”命令时...
git clone <repository>
...以 ssh 协议的样式指定<repository>
。这里是 ssh 协议风格,as described on the "git" reference page for "git clone", at the sub-header "GIT URLs":
[user@]host.xz:path/to/repo.git/
注意没有scheme说明符;也就是说,没有迹象表明ssh:
、git:
、https:
和ftps:
。相反,冒号:
将“主机”与“路径”分开。冒号:
的这种使用不符合 URL 格式,并且不符合将这种协议样式与其他协议样式区分开来。
在“ssh”中进行配置的一个潜在的重要好处是“ssh”允许使用别名。假设,对于特定机器的“ssh”会话,我通常想以自己的身份登录,但有时我想以其他人的身份登录,名为“user_for_git”。进一步假设用户的身份文件不同。 “ssh”的以下“配置”具有由我自己的真实域命名的条目,但具有“user_for_git”的别名。请注意,关键字“Host”引入了一个部分,而变量“HostName”是该部分中的几个参数之一。
Host go_git.example.com
# Specify the real host name
HostName = example.com
User = user_for_git
IdentityFile = ~/.ssh/id_rsa_for_git_at_example_com
Host example.com
# Specify the real host name
HostName = example.com
User = user_me
IdentityFile = ~/.ssh/id_rsa_for_normal
有了这个,“git clone”命令可以如下:
git clone go_git.example.host:/path/to/repo.git
请注意,在这种情况下,不使用语法的可选user@
部分。远程存储库仅由 host : path
指定,但在这种情况下,host
是“ssh”配置文件中定义的别名。
在 Linux/Unix 中,“ssh”配置文件名为config
,位于主目录$HOME
下的隐藏目录.ssh
中;这表示为~/.ssh/config
。对于 Windows 中的等效位置,请在此处查看答案:https://***.com/a/62842368/3552393
【讨论】:
以上是关于在 Windows 版 Git 中使用 GIT_SSH_COMMAND的主要内容,如果未能解决你的问题,请参考以下文章