git本地多账号,ssh管理。

646 阅读4分钟

本博客适合于在一个平台有多个GitHub或多个其他(混合)托管平台的账号,也适合于对git本地账号与仓库账号的基础知识普及。

  1. 查看本地的所有账号(包含一些其他信息):

    #基础模式
    $ git config --list
    #或原始信息
    $ git config --list --show-origin
    #或查看全局 Git 账号配置
    $ git config --list --global
    

    如果只想查看用户名与邮箱,可以:

    $ git config user.name
    $ git config user.email
    
  2. 创建本地账号

    #创建的同时设置该账号为全局默认账号(注意:如果之前有设置过全局账号,这会替换之前的默认账号。
    #不过这里只是替换默认指定的账号,不是完全删除或覆盖之前的账号,之前的账号还好好的)
    $ git config --global user.name "your_username"
    $ git config --global user.email "your_email"
    
    #当然,如果只想仅仅添加一个全局账号,默认的全局账号还是之前的,不动它
    $ git config --global --add user.name "your_username"
    $ git config --global --add user.email "your_email"
    
    #如果只想创建一个跟当前库相关的本地账号(记得进入库所在的目录)
    $ git config --local user.name "your_username"
    $ git config --local user.email "your_email"
    # --local参数是可选的,可以直接省略为:
    $ git config user.name "your_username"
    $ git config user.email "your_email"
    #注:如果想把上面本仓库的账号应用为全局,那仍然需要使用上面的全局账号配置代码操作一遍。
    
  3. 如何创建GitHub所需的SSH Key?可参考GitHub给的一个教程:如何创建SSH Key

    #创建一个ssh key,后续按提示操作即可,我个人一般是创建一个无密码的SSH Key。
    $ ssh-keygen -t ed25519 -C "your_email@example.com"
    

    注:这个ssh key创建好之后默认在你电脑的这个路径下:C:Users\你的用户名\.ssh,默认公钥文件名是:id_ed25519.pub,私钥文件名是:id_de25519

    [可选] 如果你喜欢或者有必要创建一个密码的话,那可以把这个“SSH Key”添加到“SSH Key代理”中(这一步的作用是不必每次都输入密码,输入过一次密码后,后续的密码输入交由“SSH Key代理”帮忙):

    #1.确保这个代理已经启动了
    eval "$(ssh-agent -s)"
    #如果已经启动了它会输出这样的进程ID:
    #Agent pid 3229
    
    #2.把ssh key添加到代理中(id_ed25519是你的ssh key的文件名):
    ssh-add ~/.ssh/id_ed25519
    
  4. 复制SSH Key的内容粘贴到Github对应的地方:

    #复制内容可以右键打开那个SSH Key文件复制,也可以使用代码(id_ed25519是你的ssh key的文件名):
    $ clip < ~/.ssh/id_ed25519.pub
    

    点击Github中个人头像->Settings->SSH and GPG keys->New SSH Key,title随便取,key就粘贴到这里,保存。

  5. 实操1。克隆账号1parcool的仓库repo_of_parcool(注意:选择SSH方式,而不是HTTPS方式):

    repo_of_venyore.png

    $ git clone git@github.com:parcool/repo_of_parcool.git
    # 克隆成功,输出如下:
    Cloning into 'repo_of_parcool'...
    remote: Enumerating objects: 30, done.
    remote: Counting objects: 100% (30/30), done.
    remote: Compressing objects: 100% (23/23), done.
    remote: Total 30 (delta 14), reused 20 (delta 6), pack-reused 0
    Receiving objects: 100% (30/30), 128.14 KiB | 145.00 KiB/s, done.
    Resolving deltas: 100% (14/14), done.
    
  6. 实操2。克隆账号2venyore的仓库repo_of_venyore(注意:选择SSH方式,而不是HTTPS方式):

    repo_of_venyore.png

    $ git clone git@github.com:venyore/repo_of_venyore.git
    # 克隆失败,输出如下:
    Cloning into 'repo_of_venyore'...
    ERROR: Repository not found.
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    
  7. 分析:为什么实操2会失败?

    • 没有生成账号2venyore的ssh key并填入到对应的位置;
    • 没有配置config文件,git会默认去读取前面创建的ssh keyid_de25519,用仓库1的key去拉取仓库2的私有库肯定不行的。
    • 没有调整拉取的地址。使用git clone git@github.com:venyore/repo_of_venyore.git它也不会去读取仓库2的ssh key(假设你已经创建好它),还需要指定Host属性。
  8. 实操3。

    1. 如上第3、4步骤创建的key一样,给第二个仓库也创建一个key(注意:创建的时候需要指定key的名字,要不会覆盖第一个了,自己创建的时候看提示操作)。将这个ssh key命名为id_ed2519_venyore吧!
    2. 然后再C:\Users\YourUsername\.ssh下创建一个config文件(无后缀名,git会自动去读取它),编辑并输入以下内容后保存:
      #Account parcool,这个是默认的那个账号,咱们也可以指定一下,不指定也是行的,默认会去读id_ed25519。这个Host属性是可以自己随便取名的,后面执行git clone的时候对应上就行。
      Host github.com-parcool
      HostName github.com
      User git
      IdentityFile /c/Users/YourUsername/.ssh/id_ed25519
      #Account venyore
      Host github.com-venyore
      HostName github.com
      User git
      IdentityFile /c/Users/YourUsername/.ssh/id_ed25519_venyore
      
    3. 现在重复拉取实操2的仓库:
      #之前的:
      #$ git clone git@github.com:venyore/repo_of_venyore.git
      #现在的(注意与前面config文件里配置的Host属性的名称对应上):
      $ git clone git@github.com-venyore:venyore/repo_of_venyore.git
      #克隆成功,输出如下:
      Cloning into 'repo_of_venyore'...
      remote: Enumerating objects: 30, done.
      remote: Counting objects: 100% (30/30), done.
      remote: Compressing objects: 100% (23/23), done.
      remote: Total 30 (delta 14), reused 20 (delta 6), pack-reused 0
      Receiving objects: 100% (30/30), 128.14 KiB | 145.00 KiB/s, done.
      Resolving deltas: 100% (14/14), done.
      
  9. 再次重复一下,前面创建的本地账号怎么在实操中没体现出来? 因为实操中我们只是拉取了一下库而已,那前面的本地账号有什么用?简单来说就是标记每一次提交者是谁,也就是说在提交的时候必须要有本地账号,当然,这个本地账号只是用来标记是谁提交的这次commit而已。比如我们常用的idea之类的在首次提交都会弹出一个框让你输入账号与邮箱,这个其实跟你的GitHub账号没什么关系,只要当前提交的这个库不重复就OK了,而邮箱就是在库的某些操作下可以给你的邮箱发个通知而已。至于选项“Set properties globally”这个选项就是说让你勾选后就设置该账号为默认git全局账号了,以后的库都用这个账号。

    set_email.png

--------------------更新-------------------------

如果后面什么时候去提交代码或更新啥的又报错的话,可以运行:

$ ssh-add -l

来查看是否有把你期望的ssh key添加到ssh agent里,如果没有的话添加一下:

$ ssh-add ~/.ssh/id_ed25519_venyore

当然,这种添加的方式都是临时的,重启终端或电脑后会再次需要这么去加一次。那怎么办?可以在config文件里配置一个属性:

#之前的另一个账号省略,写法与下面这个一样...
#Account venyore
Host github.com-venyore
AddKeysToAgent yes  #注意这个新增的选项,这个选项会在需要时自动把密钥添加到ssh-agent里。这意味着当你首次使用密钥时,系统会提示你输入密钥的密码,然后这个密钥就会被添加到ssh-agent里,以便后续使用。然后,只要ssh-agent在运行,你就不需要再次输入密码。
UseKeychain yes #如果是macOS或许需要这个属性,这是macOS系统特有的一个选项。如果启用了这个选项,那么macOS的ssh-agent会在你首次使用密钥时提示你输入密码,然后将这个密码存储在你的钥匙串(Keychain)中。然后,只要你已经解锁了你的钥匙串,你就可以在没有输入密码的情况下使用这个密钥。
HostName github.com
User git
IdentityFile /c/Users/YourUsername/.ssh/id_ed25519_venyore