簡體   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