在Git for Windows中使用GIT_SSH_COMMAND

21

我现在正在使用 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. 在Windows上安装git2. 在项目文件夹中右键单击并选择“Git Bash Here”; 3. 再次运行相同的命令。 - Binar Web
3个回答

24

在Windows中,您不再需要设置环境变量。

使用git 2.10+(Q3 2016)还可以为GIT_SSH_COMMAND设置配置,这比环境变量更容易(并且可以全局设置,或者为特定存储库本地设置)

参见提交3c8ede3(2016年6月26日)由Nguyễn Thái Ngọc Duy(pclouds
(由Junio C Hamano -- gitster--提交dc21164中合并,于2016年7月19日)

添加了一个新的配置变量core.sshCommand,用于指定每个存储库要使用的GIT_SSH_COMMAND的值。

core.sshCommand:

如果设置了这个变量,在需要连接远程系统时,git fetchgit 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 (Q1 2018)引入了一种新机制,可以在不损害旧版Git的情况下升级现有的通信协议,已经获得认可和证实。

参见提交记录 6464679(2017年10月16日)和提交记录 0cd8328(2017年9月26日),作者是Jonathan Tan (jhowtan)
参见提交记录 94b8ae5提交记录 3c88ebd提交记录 19113a2提交记录 0c2f0d2提交记录 2609043提交记录 aa9bab2提交记录 dfe422d提交记录 373d70e提交记录 5d2124b(2017年10月16日),作者是Brandon Williams (mbrandonw)
(由提交记录 4c6dad0,在2017年12月6日被Junio C Hamano -- gitster --合并)

ssh: 引入 'simple' ssh 变种

使用 'ssh' 传输时,'-o' 选项用于指定应在远程端设置的环境变量。
这允许Git在联系服务器时发送附加信息,通过'GIT_PROTOCOL' 环境变量请求使用不同的协议版本,如 "-o SendEnv=GIT_PROTOCOL</


@Ezh 为什么?你的 Git 版本是多少?你应该设置你想要使用的 ssh 命令,例如 git config core.sshCommand "ssh -i /path/to/my/private/key"git config core.sshCommand 只会返回设置的值)。 - VonC
最新的Git(2.21)在cmd.exe环境下运行“git config core.sshCommand ...”时会返回错误。从bash运行时可以正常工作,但从cmd.exe无法正常工作。 - Ezh
@Ezh 我刚刚尝试了一个 git config core.sshCommand "a command" 命令:它可以正常工作,使用的是 git 版本 2.21.0.windows.1。 - VonC
可能是不同的环境或安装了一些额外的工具。我在3台不同的电脑上(其中2台是Win10,1台是Windows Server 2016)安装了“git for windows” 2.21 x64,并选择了所有默认安装选项 - 但“git config core.sshCommand”在任何一台电脑上都无法正常工作。 - Ezh
1
@VonC,非常感谢您! :) 我花了很多时间寻找决策。 - Viktor
显示剩余3条评论

4

以下是答案:

set GIT_SSH_COMMAND=ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no & git push origin master

错误:不允许使用和号(&)字符。&运算符已保留供将来使用;用双引号将和号("&")括起来,以便将其作为字符串的一部分传递。 - Matt
2
@Matt - 你用的是Windows吗?&符号连接Windows shell命令,在Linux上你可以使用行终止符(分号)来实现相同的功能。 - Jamie Marshall

2

有一种更好的方法来实现你的目标。虽然问题和各种答案很有趣且富有教育意义,但是实现目标的最佳方法不涉及GIT_SSH_COMMAND变量。

与其将信息放在“git”中,不如将信息放在“ssh”中。

在Unix/Linux中,“ssh”命令一直有一个“config”文件。在近年来的Windows中,也有这种能力。配置“ssh”以了解您的身份文件,然后当您执行“git clone”命令时...

git clone <repository>

需要以ssh协议的方式指定<repository>。以下是ssh协议样式,在"git clone"的"git"参考页面上,子标题为"GIT URLs"中有详细描述:

[user@]host.xz:path/to/repo.git/

请注意,没有“方案”说明符;也就是说,没有“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,位于隐藏目录.ssh下,该目录位于主目录$HOME下;这表示为~/.ssh/config。对于Windows中等效的位置,请查看这里的答案:https://dev59.com/jF8d5IYBdhLWcg3w8F--#62842368

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接