如何让 git 默认为 ssh 而不是 https 对于新的存储库

Posted

技术标签:

【中文标题】如何让 git 默认为 ssh 而不是 https 对于新的存储库【英文标题】:How do I get git to default to ssh and not https for new repositories 【发布时间】:2021-11-01 05:54:40 【问题描述】:

这些天,当我在 GitHub 上的设置页面上创建一个新存储库时,我得到:

git remote add origin https://github.com/nikhilbhardwaj/abc.git
git push -u origin master

每当我必须推送提交时,我都需要输入我的 GitHub 用户名和密码。

我可以手动将其更改为

git@github.com:nikhilbhardwaj/abc.git

.git/config。我觉得这很烦人 - 有什么方法可以将 git 配置为默认使用 SSH?

【问题讨论】:

我认为@MoOx 的回答可能最符合您的要求。 insteadOf 技巧至少从 2012 年就已经存在。另请参阅 How to convert git: urls to http: urls。 【参考方案1】:

将存储库的源分支设置为 SSH

GitHub 存储库设置页面只是一个建议的命令列表(GitHub 现在建议使用 HTTPS 协议)。除非您对 GitHub 的站点具有管理权限,否则我不知道有什么方法可以更改他们建议的命令。

如果您更愿意使用 SSH 协议,只需像这样添加一个远程分支(即使用此命令代替 GitHub 建议的命令)。要修改现有分支,请参阅下一节。

$ git remote add origin git@github.com:nikhilbhardwaj/abc.git

修改预先存在的存储库

如您所知,要将预先存在的存储库切换为使用 SSH 而不是 HTTPS,您可以在 .git/config 文件中更改远程 URL。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    -url = https://github.com/nikhilbhardwaj/abc.git
    +url = git@github.com:nikhilbhardwaj/abc.git

一个快捷方式是使用set-url 命令:

$ git remote set-url origin git@github.com:nikhilbhardwaj/abc.git

更多关于 SSH-HTTPS 开关的信息

"Why is Git always asking for my password?" - GitHub 帮助页面。 GitHub's switch to Smart HTTP - *** 相关问题 Credential Caching for Wrist-Friendly Git Usage - 关于 HTTPS 以及如何避免重新输入密码的 GitHub 博客文章

【讨论】:

谢谢,我不知道他们将智能 https 设为默认值。 这可能对 Windows 用户有好处,但在 Linux 上却是一个很大的倒退:ssh 始终有效,而智能 HTTPS 的新密码缓存仅适用于 Windows。 “Mac 版本在哪里?” 上有一个注释,但对于 linux 用户,没有一个单个字。 我要补充一点,这种方法根本不会干扰github的mac客户端。更改它,您可以毫无问题地使用git的命令行和gui版本(github的客户端)。 再次set-url 帮助我!非常感谢! 现在 GitHub 正在弃用密码访问 (see here),看来这个答案需要成为其官方文档的一部分。它已经存在了吗?【参考方案2】:

GitHub

git config --global url.ssh://git@github.com/.insteadOf https://github.com/

比特桶

git config --global url.ssh://git@bitbucket.org/.insteadOf https://bitbucket.org/

这告诉 git 在连接到 GitHub/BitBucket 时始终使用 SSH 而不是 HTTPS,因此默认情况下您将通过证书进行身份验证,而不是提示输入密码。

【讨论】:

如果有人想在the documentation 中查找此内容,请搜索url.<base>.insteadOf 小心这似乎破坏了一些东西——我注意到自制软件的一些功能在我做出这个改变后停止工作(即安装非默认版本/分支) 对于 gitlab: git config --global url.ssh://git@gitlab.com/.insteadOf gitlab.com 认为应该是git config --global url.ssh://git@github.com:.insteadOfgithub.com,因为github喜欢git@github .com:/.git。 (编辑git config --global url.git@github.com:.insteadOf https://github.com/ 肯定在 git 2.7.4 中工作。) 由于此处的评论提到自制问题,删除--global 并在公关回购的基础上执行此操作可能是个好主意。【参考方案3】:

response provided by Trevor is correct。

但您可以直接在.gitconfig 中添加以下内容:

# Enforce SSH
[url "ssh://git@github.com/"]
  insteadOf = https://github.com/
[url "ssh://git@gitlab.com/"]
  insteadOf = https://gitlab.com/
[url "ssh://git@bitbucket.org/"]
  insteadOf = https://bitbucket.org/

【讨论】:

简单多了+1 +1 这个技巧。内核人员也推荐它。另请参阅内核新手邮件列表中的git pull。 更清洁的解决方案 - 非常适合 golang 项目,其中“go get”默认为 https,并且希望单独将 url 设置为 ssh,例如用于私人回购等。 对于 Gitlab:[url "ssh://git@gitlab.com/"] insteadOf = https://gitlab.com/ 如果你想影响推送 URL 但不影响获取,还有 pushInsteadOf。可以使用git remote -v 来检查 git 将要使用的有效 URL。 这不起作用,至少对于现有的存储库而言。【参考方案4】:

你需要在 ssh 中克隆,而不是在 https 中。

为此,您需要设置 ssh 密钥。我准备了这个自动化的小脚本:

#!/usr/bin/env bash
email="$1"
hostname="$2"
hostalias="$hostname"
keypath="$HOME/.ssh/$hostname_rsa"
ssh-keygen -t rsa -C $email -f $keypath
if [ $? -eq 0 ]; then
cat >> ~/.ssh/config <<EOF
Host $hostalias
        Hostname $hostname *.$hostname
        User git
    IdentitiesOnly yes
        IdentityFile $keypath
EOF
fi

然后运行它

bash script.sh myemail@example.com github.com

更改您的远程网址

git remote set-url origin git@github.com:user/foo.git

~/.ssh/github.com_rsa.pub 的内容添加到您在 github.com 上的 ssh 密钥

检查连接

ssh -T git@github.com

【讨论】:

【参考方案5】:

您可能不小心在 https 而不是 ssh 中克隆了存储库。 我在github上多次犯过这个错误。 确保在克隆时首先复制 ssh 链接,而不是 https 链接。

【讨论】:

需要用ssh链接克隆一个新的 您还可以将 repo 链接从 HTTP 更改为 SSH,请参阅其他答案。【参考方案6】:

SSH 文件

~/.ssh/config file
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile=/dev/null
    LogLevel QUIET
    ConnectTimeout=10
Host github.com
        User git
        AddKeystoAgent yes
        UseKeychain yes
        Identityfile ~/github_rsa

编辑 reponame/.git/config

[remote "origin"]
        url = git@github.com:username/repo.git

【讨论】:

【参考方案7】:

仅供参考 - 由于 github 不再允许 ssh,我正在使用它:

[url "git@github.com:"]
    insteadOf = https://github.com/
[url "git@gist.github.com:"]
    insteadOf = https://gist.github.com/

【讨论】:

【参考方案8】:

虽然这里的其他答案直接回答了名义上的问题(以一种我不知道的方式是可能的!TIL 一些关于 git 的新东西!)关于自动将基于 https 的遥控器变成 git+ssh 的遥控器,但从一开始就“正确”地做到这一点的“正常”方法是不给githttps url。

GitHub(以及其他流行的 git 托管服务)总是有一个小按钮,可以让您获取 git 应该克隆的 URL。你只需要点击小“SSH”按钮:

或者用于新项目

一旦您选择“SSH”选项,GitHub(和其他人)会记住(只要您登录)并在将来将其设为默认值。

【讨论】:

以上是关于如何让 git 默认为 ssh 而不是 https 对于新的存储库的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Git 子模块使用 SSH 而不是 HTTP?

GIT里 SSH和HTTPS的区别

2017.6.30 使用git新建项目仓库并拉取提交代码

TortoiseGit推送失败的问题

如何让 Git 推/拉通过 Windows 7 防火墙?

为不同的 GitHub 帐户使用多个 SSH 密钥