繁体   English   中英

在 Windows 版 Git 中使用 GIT_SSH_COMMAND

[英]Using GIT_SSH_COMMAND in Git for Windows

我现在使用 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 中做这样的事情? 在任何地方都找不到任何答案。

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

使用 git 2.10+(2016 年第 3 季度),您还可以为GIT_SSH_COMMAND设置配置,这比环境变量更容易(并且可以全局设置,也可以针对特定存储库在本地设置)

请参阅Nguyễn Thái Ngọc Duy ( pclouds ) 的commit 3c8ede3 (26 Jun 2016 )
(由Junio C gitster合并-- gitster -- in commit dc21164 ,2016 年 7 月 19 日)

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

core.sshCommand:

如果设置了这个变量, git fetchgit push将在需要连接到远程系统时使用指定的命令而不是ssh
该命令与GIT_SSH_COMMAND环境变量的形式相同,并在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 一起使用而不会损害它们。

犯6464679 (2017年10月16日),并提交0cd8328通过(2017年9月26日)乔纳森·谭( jhowtan
参见commit 94b8ae5commit 3c88ebdcommit 19113a2commit 0c2f0d2commit 2609043commit aa9bab2commit dfe422dcommit 373d70ecommit 5d2124b (16) Brandon 威廉姆斯 ( mbrandonw )
(由Junio C gitster合并-- gitster -- in 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 不兼容,因此如果命令的基本名称与 Git 已知的变体不匹配,请收紧此约束并假定为“ simple ”的变体。
新的 ssh 变体“ simple ”将仅将主机和要执行的命令( [username@]host命令)作为参数传递给ssh命令。

这是答案:

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

更好的方法来实现您的目标 虽然问题和各种答案很有趣且具有启发性,但实现目标的最佳方法不涉及 GIT_SSH_COMMAND 变量。

不是将信息放入“git”,而是将信息放入“ssh”。

“ssh”命令在 Unix/Linux 中总是有一个“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 : //stackoverflow.com/a/62842368/3552393

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM