使用SSH连接GitHub仓库

前言:

讲一个笑话:最近给新电脑装Git工具,才意识到自己之前用SSH连接GitHub的方法居然是错的。是这样的,我配置了密钥对后依然在使用之前配置的浏览器登录。这次换新电脑,之前没有登录GitHub,新装的Git工具。跟着官方文档配置完成后,git push -u origin master 居然还弹出登录页面,然后我才意识到之前错了。使用SSH连接仓库和创建仓库时GitHub教你的方法两者协议是不一样的,网页上给的参考命令是用的HTTPS。这些其实在开始使用Git文档中有的,只是不仔细看容易忽略。官方的SSH连接操作文档半中半英可读性也不够好,第一次读的时候没看仔细。以上教训告诉我们,学习不能急于求成,基础要仔细掌握。所以鄙人在此水贴一篇,算是个基础教程吧。(看我不如通读GitHub的文档?)

前置基础:

GitHub是一个提供Git服务的网站。Git是一套版本控制工具。所以,使用GitHub除了一些网页上的设置,其主要功能就是使用Git。首次使用Git首先要下载安装,然后便是要配置用户名和邮箱,建议设置成和GitHub上相同的。配置分为全局配置和仓库配置,全局就是没有仓库配置时默认的用户信息;仓库的就是单独某个仓库生效的。下载安装程序运行,一路点击下一步,装完Git后便可以打开Git Bash啦。

# 设置全局配置:
git config --global user.name "github's Name"
git config --global user.email "github@xx.com"
# 设置仓库的配置,要在仓库目录下执行:
git config user.name "git's Name"
git config user.email "git@xx.com"
# 查看的命令,查哪在哪执行:
git config --list

Git存储内容项目的单元被称为仓库(Repository),作为一个仓库,创建的过程称之为初始化。然后创建文件,需要产生一个历史记录时,就将变更的文件按需添加到暂存区,提交(Commit)一次。有了一次Commit后,便可以为其设置远端仓库地址,将本地的仓库变化推送过去保存。大致这么个流程:

# 创建一个以仓库名称命名的目录(或者叫文件夹),并进入其中。
mkdir XX-Repository
cd XX-Repository
# 使用初始化命令
git init
# 按照实际需要,创建或从其他地方拷贝文件到目录下。惯例要创建一个README.md文件,给人看。
touch README.md
cp ../../XXX.XXX ./XXX.XXX     # 这个Linux下用的多,Win下不如直接图形界面拖拽。
# 文件写的差不多了,先按需添加到Commit暂存区,
git add XXX.XXX XXX.XXX      # 添加指定文件
git add -A      # 添加所有新增或变更的文件
# 然后执行Commit,一般惯例要带-m参数,备注本次提交的变更。
git commit -m "first commit"
# 添加远端仓库地址,地址从仓库主页的绿色Code按钮中能看到:
git remote add origin https://github.com/USERNAME/REPOSITORY.git
# 设置远端仓库的分支为master,并推送到该分支。
git push -u origin master
# 因为上面是HTTPS的连接方式,所以会弹出网页的登录页面。按提示登录即可完成推送。

到此一个Git仓库大致就在GitHub上搞起来了。那如何换用SSH方式连接仓库呢?

通过SSH连接:

这里我抄一下官方的内容,原文半英半中,写了很多注意事项,很多内容的位置却不合理。在此我缩减了一下,有问题建议看官方文档。

检查已有的SSH密钥对

首先可以检查下您电脑上有没有已经生产的可用的密钥对,他们是成对的一组文件,包含私钥和公钥。

  1. 打开Git Bash。
  2. 执行 ls -al ~/.ssh ,如果.ssh目录下有密钥对变回在回显的信息中看到文件名类似于:
    • id_rsa.pub
    • id_ecdsa.pub
    • id_ed25519.pub

这里,如果提示目录不存在,那看样子就是啥都没有了。如果有密钥对,就可以用后面的方法检查有没有密码加密,没有密码或者知道密码便可以直接用。否则就按下面的方法新建密钥对。

生成新的SSH密钥

如果您还没有 SSH 密钥,则必须生成新 SSH 密钥用于身份验证。为了安全,需要在生产的密钥对上添加密码保护。如果不想在每次使用 SSH 密钥时重新输入这个密码,您可以将密钥添加到 SSH 代理(即ssh-agent),让它管理您的 SSH 密钥并记住您的密码。

  1. 打开Git Bash。

  2. 复制下面的文本粘贴到Bash中执行(替换为您自己的 GitHub 电子邮件地址)。

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

    注:如果您使用的是不支持 Ed25519 算法的旧系统,请使用以下命令:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  3. 此时将以邮箱地址为标签生成新的SSH密钥对。

    • 提示您“Enter a file in which to save the key(输入要保存密钥的文件)”时,按 Enter 键。 这密钥会存在默认文件位置。(即~/.ssh ,不存在默认位置没有积极意义且会让后面更繁琐。)
    • 在提示 Enter passphrase 时设置密码,在提示 Enter same passphrase again: 时重复密码。

在 Git for Windows 上自动启动 ssh-agent

您可以在打开 bash 或 Git shell 时自动运行 ssh-agent。并让它自动添加~/.ssh目录下新的 SSH 密钥。

  1. 复制以下内容并将其粘贴到 Git shell 的 ~/.profile 文件中保存,没有就创建一个:

    env=~/.ssh/agent.env
    
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
    
    agent_start () {
        (umask 077; ssh-agent >| "$env")
        . "$env" >| /dev/null ; }
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
        ssh-add
    elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
        ssh-add
    fi
    
    unset env

    ~/ 这个位置是用户的HOME目录,Windows 下就是 C:\Users\<你的用户名> 这个目录。

    如果您的私钥没有存储在默认位置之一(如 ~/.ssh/id_rsa),您需要告知 SSH 身份验证代理其所在位置。 要将密钥添加到 ssh-agent,请输入 ssh-add ~/path/to/my_key

  2. 重新开一个Git Bash窗口,ssh-agent首次被启动,自动搜索新增的密钥对,然后提示输入密码,按要求输入密码后密钥对就被加入了ssh-agent。以后运行 Git Bash 时便会自动启动 ssh-agent ,不再需要输入密码。

  3. ssh-agent 进程将继续运行,直到您注销、关闭计算机或终止该进程。

添加SSH 公钥到 GitHub 帐户

前面的操作概括来讲就是将本地的私钥添加到了本地的SSH代理中,下面要将公钥添加到GitHub上。

  1. 网页右上角点击头像,然后点击 Settings。在左侧找到 Access 部分,点击 SSH and GPG keys

  2. 点击右上方的 New SSH key,打开 SSH keys/ Add new 页面。

  3. 在 "Title"(标题)文本框中,为新公钥添加描述性标题,要求自己看到就知道是啥。 例如,如果密钥对用于枪神6笔记本上,此公钥名称可以是 "God of Gun 6"。

  4. 使用以下命令将 SSH 公钥复制到剪贴板,并粘贴到网页的"Key"(密钥)文本框中。最后点击 Add SSH key(添加 SSH 密钥),按提示输入GitHub的登录密码完成公钥的添加。

    clip < ~/.ssh/id_ed25519.pub

    提示:注意文件位置,此处是默认位置与文件名,如果前面你的位置不一样,需要灵活改变。如果 clip 命令不可用,可找到隐藏的 .ssh 文件夹,在常用的文本编辑器中打开该.pub文件,并将其内容复制到剪贴板。

这样GitHub那边有对应的公钥,我有对应的私钥,我本地的SSH便能够向GitHub证明我的身份啦。

测试 SSH 连接

测试连接时,您可能需要使用密码(即您之前创建的 SSH 密钥对的密码)验证此操作。如果密钥的密码之前没有缓存到ssh-agent中。如果是按照前面操作过来的,应该无需再次输入密码。

  1. 打开 Git Bash。

  2. 输入以下内容:

    ssh -T git@github.com

    您可能会看到类似如下的警告:

    > The authenticity of host 'github.com (IP ADDRESS)' can't be established.
    > RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
    > Are you sure you want to continue connecting (yes/no)?
  3. 验证所看到消息中的指纹是否匹配 GitHub 的 RSA 公钥指纹。 如果是,则输入 yes。如果一切正常,会看到GitHub返回了一段包含您的用户名的消息。

    > Hi username! You've successfully authenticated, but GitHub does not
    > provide shell access.

将远端仓库的 URL 从 HTTPS 切换到 SSH

  1. 打开 Git Bash。

  2. 将当前工作目录切换到为您的本地仓库。

  3. 列出现有远程仓库以获取要更改的远程仓库的名称,关注一下USERNAME和REPOSITORY部分。

    $ git remote -v
    > origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
    > origin  https://github.com/USERNAME/REPOSITORY.git (push)
  4. 使用 git remote set-url 命令更改远端的 URL ,注意将上面获取的名称换到下面命令中。

    $ git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

这里也可以使用git config 命令直接调整配置处理。

git config -l # 查看配置
git config remote.origin.url git@github.com:USERNAME/REPOSITORY.git
git config -l # 再次执行,检查修改结果

参考:

标签: Git

添加新评论

(头像使用Gravatar服务,如需自定义,请访问Gravatar.com)