ChatGPT解决这个技术问题 Extra ChatGPT

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

这些天,当我在 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

C
Community

将存储库的源分支设置为 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 开关的更多信息

“为什么 Git 总是要求我输入密码?” - GitHub 帮助页面。

GitHub 切换到 Smart HTTP - 相关 StackOverflow 问题

Credential Caching for Wrist-Friendly Git Usage - 关于 HTTPS 以及如何避免重新输入密码的 GitHub 博客文章


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

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

BitBucket 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:.insteadOf github.com,因为github喜欢git@github.com:<USERNAME>/ <REPO>.git. (EDIT git config --global url.git@github.com:.insteadOf https://github.com/ 肯定适用于 git 2.7.4。)
由于此处的评论提到了自制问题,因此删除 --global 并在 pr repo 基础上执行此操作可能是个好主意。
C
Community

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
更清洁的解决方案 - 非常适合“go get”默认为 https 并且想要单独将 url 设置为 ssh 的 golang 项目,例如私有 repos 等。
对于 Gitlab:[url "ssh://git@gitlab.com/"] insteadOf = https://gitlab.com/ 如果您想影响推送 URL 但不影响获取,还有 pushInsteadOf。可以使用 git remote -v 来检查 git 将要使用的有效 URL。
这不起作用,至少对于现有的存储库是这样。
r
rofrol

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

$ ssh-keygen -t ed25519 -C "your_email@example.com"

~/.ssh/id_rsa.pub 的内容添加到 github.com 上的 ssh 密钥。

如果您需要为不同的主机设置单独的密钥,您可以使用此脚本:

#!/usr/bin/env bash

if [ $# -lt 2 ]; then
  echo "Provide email and hostname"
  exit 1
fi

email="$1"
hostname="$2"
keypath="$HOME/.ssh/${hostname}_rsa"
ssh-keygen -t ed25519 -C $email -f $keypath

if [ ! $? -eq 0 ]; then
  echo "Error when running ssh-keygen"
  exit 1
fi

exit 0
cat >> $HOME/.ssh/config <<EOF
Host $hostname
        Hostname $hostname *.$hostname
        User git
    IdentitiesOnly yes
        IdentityFile $keypath
EOF

像这样运行它

bash generate_ssh.sh your_email@example.com github.com

更改您的远程网址

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

(或仅编辑 .git/config

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

检查连接

ssh -T git@github.com

这对我来说很方便,只是我必须将 Hostname $hostname *.$hostname 更改为 Hostname $hostname 才能工作。
M
Mike Lyons

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


需要用 ssh 链接克隆一个新的
您还可以将 repo 链接从 HTTP 更改为 SSH,请参阅其他答案。
b
bhargav joshi

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

D
Devin Rhode

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

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

C
Cameron Tacklind

虽然这里的其他答案直接回答了名义上的问题(以我不知道的方式!TIL 一些关于 git 的新东西!)关于自动将基于 https 的遥控器变成 git+ssh 的遥控器,“正常”从一开始就“正确”执行此操作的方法是不向 git 提供 https 网址。

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

https://i.stack.imgur.com/scVYE.png

或者对于一个新项目

https://i.stack.imgur.com/DIIeP.png

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