结论
-
~/.ssh/config
中 Host 值可以随意写
-
cat .git/config
中 [remote "origin"] url = git@B:test/demo.git
url 值 @ 后面 冒号: 前面与 ~/.ssh/config
中 Host 值对应 ,如图:
起因
- 我报了一个在线课程,每天网上学习,然后他家的课程不让下载;
- 这就造成了一个困扰,每次地铁上看都是用的流量;
- 这还不算完,后来,他家网站升级了;
- 这一升级不要紧,微信看的话会闪退;手机浏览器 和 iPad 直接进行了微信授权的重定向看不了了;
- 嗯…,很烦,课程很优质,技术不太行;
- 于是我决定还是下载下来看,F12 看了一下请求地址,发现还不是一个单独的视频文件,也很正常;
- 网上搜索了一下,找到了一个 :M3U8 Downloader(软件说明里的源码地址:https://github.com/nilaoda/M3U8-Downloader);
- 试了试,发现,哈哈,真难用;顺着他的 github 网址,想看看代码,发现已经404了;
- 于是直接在 github 上搜了一下;
- 发现有两个项目 (地址:https://github.com/search?q=user%3Anilaoda+M3U8-Downloader)最后看了看 readme ,决定不用这个了;
- 再次上网搜索,发现了 马赛克视频助手(mask);
- 用了一下,发现不错,又能自动嗅探,又能合并,速度也很快;只是不能几个视频同时下载;
- 然而好景不长,不到一个月,软件提示什么 为了更好发展,采用会员机制,刚开始还能直接忽略勉强下载下来;
- 一个星期后基本下载不了了,就是一直提示 “会员机制”;
- 于是我决定自己写一个程序,可控性高,有问题自己解决;
- 就这样,利用周末时间,写了一个使用 web 界面下载的程序;
- 目前已经基本成形,为了后期完善方便,我决定把它放到 github 上,方便多地同时开发;
- 然后就碰到了(Permission denied) 的问题。
新建github仓库
本地仓库初始化
target/
.idea/
logs/
*.iml
- git init
- git config user.email “XXX@yyy.com” ( 不使用网上广泛流传的: git config --global user.email “XXX” ,因为我觉得全局配置太难用了 )
- git config user.name “XXX”
git add .
- git commit -m “first_commit”
- git remote add origin git@github.com:test/demo.git
- git push -u origin master : 执行到这一步就报错了,如下:
$ git push
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
- 我首先想到了 publickey ,但是这个 key 我之前在别的项目已经配置过了;
- cat ~/.ssh/config : 找到 IdentityFile 指定的私钥对应的位置,发现文件都在;
- 去到 github 上一看,ssh keys 确实是一个都没有了,但是我记得配置过;
- 难道是时间太久,github 给过期删除了?网上搜搜,也没找到明确的说法,不去管他了;
- ssh-keygen -t rsa -C “XXX@yyy.com” : 同时指定好位置;并修改 ~/.ssh/config 文件
- 又把 pub key 给上传了一遍 ,我以为应该解决了,执行
git push -u origin master
依旧报错,还是那个错;
- ~/.ssh/config 文件内容
# A(A@xx.com)
#Host github.com
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_A
User git
# B(b@xx.com)
Host B
#HostName github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_B
User git
- 执行
ssh -Tv git@github.com
: 有一行关键的信息
debug1: Reading configuration data /c/Users/Administrator/.ssh/config
debug1: /c/Users/Administrator/.ssh/config line 3: Applying options for github.c om
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to github.com [13.229.188.59] port 22.
debug1: Connection established.
debug1: identity file /c/Users/Administrator/.ssh/id_rsa_A type 0
...
- 最后一行表明 使用了 id_rsa_A ,而我想让它使用 id_rsa_B;
- ssh -Tv git@github.com : @后面的内容与 ~/.ssh/config 中host对应
- 也就是说 如果使用 ssh -Tv git@B :就会使用 id_rsa_B;
- cat .git/config 内容如下:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[user]
name = XXX
email = XXX@yyy.com
[remote "origin"]
url = git@github.com:test/demo.git
fetch = +refs/heads/*:refs/remotes/origin/*
# 下面两行实际并不存在,在 git push -u origin master 执行成功后会添加
[branch "master"]
remote = origin
merge = refs/heads/master
- 把
[remote "origin"] url = git@github.com:test/demo.git
的url 改成 [remote "origin"] url = git@B:test/demo.git
- 执行
git remote set-url origin git@B:test/demo.git
,或vim直接修改
- 再次
git push -u origin master
执行成功;
- 实际整个过程耗费了很长时间,原因是,我有一个和当前遇到问题的项目连接的同一个github用户的 项目,那个项目(称为old)开始 也是 (Permission denied)但在配置好 pubkey 后就好了,所以我百思不得其解;
- 实际old 项目在两年前甚至更久之前执行过
git remote set-url origin git@B:test/xxx.git
,但由于时间太久,这码事忘的死死的;
- 而新公司不用 git 渐渐就生疏了,实际 ~/.ssh/config 文件非常长,我只是取了一部分并去掉了敏感信息
- 写这里也是为了加强印象,时不时看到就会想起来,防止以后再像这次一样浪费这么长时间