有多台电脑才会遇到这个问题。
1、几个基础知识
1.1、git config 的 name 和 email 有什么用?
每一次 Git 提交都会带上你的用户名 + 邮箱,每一条 commit 记录,作者信息就是这两个配置,别人能直接看到。
1.2、多台电脑 Git config 的 name 和 email 该怎么写?
推荐三台电脑设置成完全相同的,不管在哪台电脑提交代码,Git 仓库都会识别成同一个人。
1.3、生成 sshkey 的 ssh-keygen 命令后面的 -C 邮箱是干什么用的?
ssh-keygen 生成sshkey的格式为
ssh-keygen -t rsa -C "邮箱"
这里的邮箱只是个备注文字,不做任何身份校验、不影响登录、不影响 Git,纯粹是给自己看的。
1.4、Git config 的 user.email 和 ssh-keygen 后面的 -C 的 “邮箱” 有什么关系?
答案是这两个邮箱完全没有关系。
1.5、ssh-keygen 的邮箱最佳实践
- 电脑mac stuio:u@qq.com
- 电脑mac book air m4: u@qq.com-air4
- 电脑win10:u@qq.com-dell
原理是采用电脑型号区分。
2、sshkey生成
2.1、配置git用户名和邮箱
2.2、生成ssh key
2.3、上传key到github等平台
2.4、测试是否配置成功
如果配置成功,则会显示:
Hi username! You’ve successfully authenticated, but GitHub does not provide shell access.
3、多sshkey配置
如果多个平台都需要使用sshkey来认证,我们可以通过在~/.ssh/目录下增加config文件来解决。这种情况下,每个项目只能设置仓库级别的用户名和邮箱,不能设置全局的。
以下以github举例
3.1、生成 github 平台的sshkey时同时指定保存的文件名
ssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C "u@qq.com"
此命令会在 ~/.ssh/ 目录下生成 id_rsa.github 和 id_rsa_github.pub 两个文件,其中 id_rsa.github.pub 里面保存的就是我们要使用的私钥 key。
3.2、添加sshkey 到 github
自行操作
3.3、配置 ~/.ssh/config 文件
3.3.1、如果 config 文件不存在,则先新建一个
touch ~/.ssh/config
3.3.2、如果 config 文件存在,则直接修改
在 config 文件里面添加如下内容 (User表示你的用户名)
#github
Host github
HostName github.com
User u
IdentityFile ~/.ssh/id_rsa.github # 你的密钥文件路径
每一段代表:
- Host:别名,随便写,用来区分不同密钥
- HostName:主机名,ip或者域名,github的固定写 github.com
- IdentityFile:密钥的实际路径
3.3.4、Host 详解
Host 必须写,它是配置的入口,SSH 就是靠她来找你用哪个密钥。
先看写法一:
Host github
HostName github.com
再看写法二:
Host github.com
HostName github.com
直接说区别:Host github.com 表示所有访问 github.com 的连接,自动用这个密钥,这是默认模式,最省心,不用该任何仓库地址;当一台电脑有好几个 Github 账号时,才需要写多个 Host 别人区分。
3.4、怎么使用这个配置?
git clone git@Host:用户名/仓库名.git
4、阿里云 codeup 实战
4.1、生成sshkey
4.1.1、mac studio 生成 sshkey
ssh-keygen -t rsa -f ~/.ssh/id_rsa.codeup -C "u@qq.com"
4.1.2、mac book air 生成 sshkey
ssh-keygen -t rsa -f ~/.ssh/id_rsa.codeup -C "u@qq.com-air4"
4.2、上传 sshkey 到 codeup
sshkey保存在 ~/.ssh/id_rsa.codeup.pub 里面,上传到 codeup 即可。
4.3、配置 ~/.ssh/config
Host codeup.aliyun.com
HostName codeup.aliyun.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa.codeup
5、codeup仓库初始化
在 codeup 新建一个仓库,地址为 git@codeup.aliyun.com:687317xxxx/eatWhat.git
初始化代码仓库
5.1、方式一:克隆仓库
git clone git@codeup.aliyun.com/687317xxxx/eatWhat.git
cd eatWhat
设置仓库信息并新建README.md文件
git config user.name "u"
git config user.email "u@qq.com"
touch README.md
git add README.md
git commit -m "add README"
推送文件到远程,官方的写法是下面的
git push -u origin HEAD
这句的意思是 把我当前所在的本地分支,推送到远程,并建立关联绑定。绑定后,下次直接输 git push / git pull 就能用,不用再写全称。
origin: 远程仓库的默认名称(固定写法)。
HEAD:当前所在的分支(你现在在哪个分支,就推哪个分支)。你在 main → 推 main,你在 dev → 推 dev
默认分支改成main分支
但是现在有个问题,git clone 到本地后,本地显示的是在master分支上,现在git的默认一般已经改成 main了,所以需要在git push 前做如下操作,更改master为main分支
# 新建 main 分支,并切到 main 分支上
git checkout -b main
# 删除 master 分支
git branch -d master
# 远程仓库初始化
git push -u origin HEAD
现在就可以愉快的使用main分支了。
注意事项:
- 执行git push 前必须有文件被add 和 commit到本地,不然执行不了。
- Git本身不跟踪空文件夹,执行 git add . 和 git push 时,空目录不会被提交到仓库,远程仓库也看不到这个空文件夹。
5.2、方式二:已有文件夹或仓库
cd existing_folder
# 初始化本地仓库
git init
git config user.name "u"
git config user.email "u@qq.com"
#添加远程仓库
git remote add origin git@codeup.aliyun.com/687317xxxx/eatWhat.git
git add .
git commit
#推送到远程仓库,如果需要更改默认仓库,请参考上面一步
git push -u origin HEAD
5.3、方式三:导入代码库
git clone --bare https://git.example.com/your/project.git your_path
cd your_path
git remote set-url origin git@codeup.aliyun.com:687317xxxx/eatWhat.git
git push origin --tags && git push origin --all