在Git for Windows中使用GIT_SSH_COMMAND

时间:2015-07-17 12:15:11

标签: git git-bash

我现在正在使用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中执行此类操作?在任何地方找不到任何答案。

3 个答案:

答案 0 :(得分:8)

您不必再在Windows中设置环境变量。

使用git 2.10 +(2016年第3季度),您还可以为GIT_SSH_COMMAND设置 config ,这比环境变量更容易(并且可以全局设置,或者在当地为特定的回购)

commit 3c8ede3Nguyễn Thái Ngọc Duy (pclouds)(2016年6月26日) (由Junio C Hamano -- gitster --合并于commit 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(2018年第一季度),您将有一个新的机制来升级现有的有线协议,并证明它可以与旧版本的Git一起使用而不会伤害它们。

commit 6464679(2017年10月16日)和commit 0cd8328(2017年9月26日)Jonathan Tan (jhowtan)。 请参阅commit 94b8ae5commit 3c88ebdcommit 19113a2commit 0c2f0d2commit 2609043commit aa9bab2commit dfe422dcommit 373d70e,{ {3}}(2017年10月16日)commit 5d2124b Brandon Williams (mbrandonw)合并于Junio C Hamano -- gitster --,2017年12月6日)

  

ssh:介绍' simple' ssh变种

     

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

     

不幸的是,并非所有ssh变体都支持发送环境   变量到远端。
  为了解决这个问题,只能使用' -o'适用于符合OpenSSH的ssh变体的选项   这是通过检查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命令。

答案 1 :(得分:2)

以下是答案:

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

答案 2 :(得分:0)

有一种更好的方法来实现您的目标。虽然问题和各种答案很有趣且具有启发性,但实现目标的最佳方法不涉及 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,位于隐藏目录 .ssh 中,该目录位于主目录 $HOME 下;这表示为 ~/.ssh/config。对于 Windows 中的等效位置,请在此处查看答案:https://stackoverflow.com/a/62842368/3552393