在 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 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 日)和 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_SSH 和 GIT_SSH_COMMAND 环境变量可以正常工作(当然,全局工作,而不是“每个存储库”) @Ezh 我刚刚尝试了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 协议的样式指定&lt;repository&gt;。这里是 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的主要内容,如果未能解决你的问题,请参考以下文章

git使用方法

vscode 怎样使用 bash on windows 上的git

如何配置git for windows

如何在 Windows 中运行 git-p4?

idea使用git管理项目(Mac版)

如何在 Windows 的 Git Bash 中设置别名?