首页

文章

github私有库权限怎么设置

发布网友 发布时间:2022-03-28 15:26

我来回答

1个回答

热心网友 时间:2022-03-28 16:55

作者:九毫
链接:http://www.hu.com/question/32089107/answer/106390700
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

在本地计算机与GitHub(或GitLab)进行通信时,传输主要基于两种协议,HTTPS和SSH,对应的仓库地址就是HTTPS URLs和SSH URLs。
首先需要强调的是,HTTPS URLs和SSH URLs对应的是两套完全独立的权限校验方式,主要的区别就是HTTPS URLs采用账号密码进行校验,SSH URLs采用SSH秘钥对进行校验。平时使用的时候我们可以根据实际情况,选择一种即可。
HTTPS URLs
GitHub官方推荐采用HTTPS URLs的方式,因为该种方式适用面更广(即使在有防火墙或代理的情况下也同样适用),使用更方便(配置更简单)。
采用HTTPS URLs地址clone/fetch/pull/push仓库时,事先无需对本地系统进行任何配置,只需要输入GitHub的账号和密码即可。不过如果每次都要手动输入账号密码,也是一件很繁琐的事情。
好在已经有多个机制可以让操作不用这么麻烦。
在Mac系统中,在启用Keychain机制的情况下,首次输入GitHub账号密码后,认证信息就会自动保存到系统的Keychain中,下次再次访问仓库时就会自动读取Keychain中保存的认证信息。
在非Mac系统中,虽然没有Keychain机制,但是Git提供了credential helper机制,可以将账号密码以cache的形式在内存中缓存一段时间(默认15分钟),或者以文件的形式存储起来(~/.git-credentials)。当然,Mac系统如果不启用Keychain机制,也可以采用这种方式。
# cache credential in memory
$ git config --global credential.helper cache
# store credential in ~/.git-credential
$ git config --global credential.helper store

在credential.helper设置为store的情况下,首次输入GitHub账号密码后,就会自动保存到~/.git-credentials文件中,保存形式为https://user:pass@github.com;下次再次访问仓库时就会自动读取~/.git-credentials中保存的认证信息。
另一个需要说明的情况是,如果在GitHub中开启了2FA(two-factor authentication),那么在本地系统中输入GitHub账号密码时,不能输入原始的密码(即GitHub网站的登录密码),而是需要事先在GitHub网站中创建一个Personal access token,后续在访问代码仓库需要进行权限校验的时候,采用access token作为密码进行输入。
SSH URLs
除了HTTPS URLs,还可以采用SSH URLs的方式访问GitHub代码仓库。
采用SSH URLs方式之前,需要先在本地计算机中生成SSH keypair(秘钥对,包括私钥和公钥)。默认情况下,生成的秘钥位于$HOME/.ssh/目录中,文件名称分别为id_rsa和id_rsa.pub,通常无需修改,保持默认即可。不过,如果一台计算机中存在多个秘钥对,就需要修改秘钥文件名,名称没有强制的命名规范,便于自己辨识即可。
如下是创建秘钥对的过程。
➜ ssh-keygen -t rsa -b 4096 -C "mail@debugtalk.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Leo/.ssh/id_rsa): /Users/Leo/.ssh/debugtalk_id_rsa
Enter passphrase (empty for no passphrase): <myPassphrase>
Enter same passphrase again: <myPassphrase>
Your identification has been saved in /Users/Leo/.ssh/debugtalk_id_rsa.
Your public key has been saved in /Users/Leo/.ssh/debugtalk_id_rsa.pub.
The key fingerprint is:
SHA256:jCyEEKjlCU1klROnuBg+UH08GJ1u252rQMADdD9kYMo mail@debugtalk.com
The key's randomart image is:
+---[RSA 4096]----+
|+*BoBO+. |
|o=oO=** |
|++E.*+o. |
|+ooo +o+ |
|.o. ..+oS. . |
| . o. . o |
| . . |
| . . |
| .. |
+----[SHA256]-----+

在创建秘钥的过程中,系统还建议创建一个名为passphrase的东西,这是用来干嘛的呢?
首先,单独采用密码肯定是不够安全的。如果密码太简单,那么就很容易被暴力破解,如果密码太复杂,那么用户就很难记忆,记录到小本子里面更不安全。
因此,SSH keys诞生了。SSH秘钥对的可靠性非常高,被暴力破解的可能性基本没有。不过,这要求用户非常谨慎地保管好私钥,如果别人使用你的计算机时偷偷地将你的私钥拷走了,那么就好比是别人拿到了你家里的钥匙,也能随时打开你家的门。
基于以上情况,解决办法就是在SSH keys之外再增加一个密码,即passphrase。只有同时具备SSH private key和passphrase的情况下,才能通过SSH的权限校验,这就大大地增加了安全性。当然,这个passphrase也不是必须的,在创建秘钥对时也可以不设置passphrase。
另外,如果每次权限校验时都要输入passphrase,这也是挺麻烦的。好在我们不用再担心这个问题,因为ssh-agent可以帮我们记住passphrase,Mac系统的Keychain也可以记住passphrase,这样我们在同一台计算机中就不用重新输入密码了。
秘钥对创建好以后,私钥存放于本地计算机(~/.ssh/id_rsa),将公钥(~/.ssh/id_rsa.pub)中的内容添加至GitHub账户。
# copy the contents of id_rsa.pub to the clipboard
➜ pbcopy < ~/.ssh/id_rsa.pub

# paste to GitHub
# Login GitHub, 【Settings】->【SSH and GPG keys】->【New SSH Key】

不过,如果此时检测本地计算机与GitHub的连接状态,会发现系统仍提示权限校验失败。
➜ ssh -T git@github.com
Permission denied (publickey).

这是因为在本地计算机与GitHub建立连接的时候,实际上是本机计算机的ssh-agent与GitHub服务器进行通信。虽然本地计算机有了私钥,但是ssh-agent并不知道私钥存储在哪儿。因此,要想正常使用秘钥对,需要先将私钥加入到本地计算机的ssh-agent中(添加过程中需要输入passphrase)。
# start ssh-agent in the background
➜ eval "$(ssh-agent -s)"
Agent pid 78370

➜ ssh-add ~/.ssh/id_rsa
Enter passphrase for /Users/Leo/.ssh/id_rsa: <myPassphrase>
Identity added: /Users/Leo/.ssh/id_rsa (/Users/Leo/.ssh/id_rsa)

添加完成后,就可以查看到当前计算机中存储的密钥。
➜ ssh-add -l
4096 SHA256:xRg49AgTxxxxxxxx8q2SPPOfxxxxxxxxRlBY /Users/Leo/.ssh/id_rsa (RSA)

再次检测本地计算机与GitHub的连接状态,校验就正常通过了。
➜ ssh -T git@github.com
Hi djileolee! You've successfully authenticated, but GitHub does not provide shell access.

后续再进行clone/fetch/pull/push操作时,就可以正常访问GitHub代码仓库了,并且也不需要再重新输入账号密码。
而且,将私钥加入ssh-agent后,即使删除私钥文件,本地计算机仍可以正常访问GitHub代码仓库。
➜ rm -rf ~/.ssh
➜ ssh-add -l
4096 SHA256:xRg49AgTxxxxxxxx8q2SPPOfxxxxxxxxRlBY /Users/Leo/.ssh/id_rsa (RSA)
➜ ssh -T git@github.com
The authenticity of host 'github.com (192.30.252.130)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
Hi djileolee! You've successfully authenticated, but GitHub does not provide shell access.

只有执行ssh-add -D或ssh-add -d pub_key命令,将私钥从ssh-agent删除后,认证信息才会失效。
➜ ssh-add -d ~/.ssh/id_rsa.pub
Identity removed: /Users/Leo/.ssh/id_rsa.pub (mail@debugtalk.com)
➜ ssh-add -l
The agent has no identities.
➜ ssh -T git@github.com
Permission denied (publickey).

同时使用多个GitHub账号
熟悉了HTTPS URLs和SSH URLs这两种校验方式之后,我们再来看之前遇到的问题。要想在一台计算机上同时使用多个GitHub账号访问不同的仓库,需要怎么做呢?
为了更好地演示,现假设有两个GitHub账号,debugtalk和djileolee,在两个账号中各自有一个仓库,debugtalk/DroidMeter和DJIXY/MobileStore(公司私有库)。
前面已经说过,HTTPS URLs和SSH URLs对应着两套独立的权限校验方式,因此这两套方式应该是都能单独实现我们的需求的。
不过在详细讲解Git权限校验的问题之前,我们先来回顾下Git配置文件的优先级。
Git配置存储位置及其优先级
Unix-like系统中,保存Git用户信息的主要有3个地方(Mac系统多一个Keychain):
/etc/gitconfig:存储当前系统所有用户的git配置信息,使用带有--system选项的git config时,配置信息会写入该文件;
~/.gitconfig或~/.config/git/config:存储当前用户的git配置信息,使用带有--global选项的git config时,配置信息会写入该文件;
Keychain Access:在开启Keychain机制的情况下,进行权限校验后会自动将账号密码保存至Keychain Access。
仓库的Git目录中的config文件(即repo/.git/config):存储当前仓库的git配置信息,在仓库中使用带有--local选项的git config时,配置信息会写入该文件;
在优先级方面,以上4个配置项的优先级从上往下依次上升,即repo/.git/config的优先级最高,然后Keychain Access会覆盖~/.gitconfig中的配置,~/.gitconfig会覆盖/etc/gitconfig中的配置。
基于SSH协议实现多账号共存
先来看下如何采用SSH URLs实现我们的需求。
在处理多账号共存问题之前,两个账号均已分别创建SSH秘钥对,并且SSH-key均已加入本地计算机的ssh-agent。
➜ ssh-add -l
4096 SHA256:lqujbjkWM1xxxxxxxxxxG6ERK6DNYj9tXExxxxxx8ew /Users/Leo/.ssh/dji_id_rsa (RSA)
4096 SHA256:II2O9vZutdQr8xxxxxxxxxxD7EYvxxxxxxbynx2hHtg /Users/Leo/.ssh/id_rsa (RSA)

在详细讲解多账号共存的问题之前,我们先来回想下平时在Terminal中与GitHub仓库进行交互的场景。
➜ DroidMeter git:(master) git pull
Already up-to-date.
➜ DroidMeter git:(master) touch README.md
➜ DroidMeter git:(master) ✗ git add .
➜ DroidMeter git:(master) ✗ git commit -m "add README"
➜ DroidMeter git:(master) git push
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 310 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@debugtalk:debugtalk/DroidMeter.git
7df6839..68d085b master -> master

在操作过程中,本地计算机的ssh-agent与GitHub服务器建立了连接,并进行了账号权限校验。
当本地计算机只有一个GitHub账号时,这个行为并不难理解,系统应该会采用这个唯一的GitHub账号进行操作。那如果本地计算机中有多个Github账号时,系统是根据什么来判断应该选择哪个账号呢?
实际情况是,系统没法进行判断。系统只会有一个默认的账号,然后采用这个默认的账号去操作所有的代码仓库,当账号与仓库不匹配时,就会报权限校验失败的错误。
那要怎样才能让系统正确区分账号呢?这就需要我们手动进行配置,配置文件即是~/.ssh/config。
创建~/.ssh/config文件,在其中填写如下内容。
# debugtalk
Host debugtalk
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# DJI
Host djileolee
HostName github.com
User git
IdentityFile ~/.ssh/dji_id_rsa

要理解以上配置文件的含义并不难,我们可以对比看下两个项目的SSH URLs:
git@github.com:debugtalk/DroidMeter.git
git@github.com:DJISZ/Store_Android.git

其中,git是本地ssh-agent与GitHub服务器建立SSH连接采用的用户名(即User),http://github.com是GitHub服务器的主机(即HostName)。
可以看出,如果采用原始的SSH URLs,由于User和HostName都相同,本地计算机并不知道应该采用哪个SSH-key去建立连接。
因此,通过创建~/.ssh/config文件,在Host中进行区分,然后经过CNAME映射到HostName,然后分别指向不同的SSH-key,即IdentityFile。由于HostName才是真正指定GitHub服务器主机的字段,因此这么配置不会对本地ssh-agent连接GitHub主机产生影响,再加上Host别名指向了不同的SSH-key,从而实现了对两个GitHub账号的分离。
配置完毕后,两个GitHub账号就可以通过Host别名来进行区分了。后续再与GitHub服务器进行通信时,就可以采用Host别名代替原先的http://github.com。例如,测试本地ssh-agent与GitHub服务器的连通性时,可采用如下方式:
➜ ssh -T git@debugtalk
Hi debugtalk! You have successfully authenticated, but GitHub does not provide shell access.
➜ ssh -T git@djileolee
Hi djileolee! You have successfully authenticated, but GitHub does not provide shell access.

可以看出,此时两个账号各司其职,不会再出现混淆的情况。
不过,我们还遗漏了很重要的一点。在本地代码仓库中执行push/pull/fetch等操作的时候,命令中并不会包含Host信息,那系统怎么知道我们要采用哪个GitHub账号进行操作呢?
答案是,系统还是没法判断,需要我们进行配置指定。
显然,不同的仓库可能对应着不同的GitHub账号,因此这个配置不能配置成全局的,而只能在各个项目中分别进行配置,即repo/.git/config文件。
配置的方式如下:
在debugtalk/DroidMeter仓库中:
➜ git remote add origin git@debugtalk:debugtalk/DroidMeter.git

在DJIXY/MobileStore.git仓库中:
➜ git remote add origin git@djileolee:DJIXY/MobileStore.git

配置的原理也很容易理解,就是将仓库的Host更换为之前设置的别名。添加完毕后,后续再在两个仓库中执行任何git操作时,系统就可以选择正确的SSH-key与GitHub服务器进行交互了。
基于HTTPS协议实现多账号共存
再来看下如何采用HTTPS URLs实现我们的需求。
有了前面的经验,我们的思路就清晰了许多。采用HTTPS URLs的方式进行Git权限校验后,系统会将GitHub账号密码存储到Keychain中(Mac系统),或者存储到~/.git-credentials文件中(Git credential helper)。
不管是存储到哪里,我们面临的问题都是相同的,即如何在代码仓库中区分采用哪个GitHub账号。
配置的方式其实也很简单:
在debugtalk/DroidMeter仓库中:
➜ git remote add origin https://debugtalk@github.com/debugtalk/DroidMeter.git

在DJIXY/MobileStore.git仓库中:
➜ git remote add origin https://djileolee@github.com/DJIXY/MobileStore.git

配置的原理也很容易理解,将GitHub用户名添加到仓库的Git地址中,这样在执行git命令的时候,系统就会采用指定的GitHub用户名去Keychain或~/.git-credentials中寻找对应的认证信息,账号使用错乱的问题也就不复存在了。
使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 怎样制作红烧牛肉 如何做红烧牛肉 红烧牛肉怎么做好吃又嫩 如何做好红烧牛肉 红烧牛肉怎么烧好吃又烂 红烧牛肉的做法最正宗的做法有哪些 红烧牛肉怎样做 怎样做红烧牛肉? 红烧牛肉怎样做好吃? 红烧牛肉怎么做好吃 红烧牛肉如何做 红烧牛肉的做法大全,红烧牛肉怎么做 github的pull request是指什么意思 抖音能看到曾经关注过的人吗? 如图,抖音关注了一个人之后又取关,那个人在粉丝... 如何在抖音找以前关注过自己的人,现在已经取关了 抖音找回取消关注的人 抖音以前关注的人取消了还能找回吗? 抖音里面,你关注了一个人,然后又取消了。还能找... 本来我的抖音和别人互相关注的,如果别人取消了关... 集团内部要搞个质量月的宣传稿,谁能给个范文, 谢... 关于质量月的宣传稿? 要油田上质量月的宣传稿,给个范文之类的就行 帮忙写一篇关于质量的稿子 全国质量月征文范文 有没有质量月有奖征文演讲范文 质量征文,下个月就是质量月,上面叫我写一篇质量... 企业公司质量月活动方案范文 篇一 谁可以帮我写一篇关于质量方面的演讲稿? 2020年质量月主题内容 质量活动月活动方案 质量月标语的质量月标语的意义 2010质量月活动总结 2010年质量月板报 工程质量月宣传栏 质量月的由来 品质的心得体会, 质量月 安全月 设备管理月等都是几月份开展?每个... 求关于质量的标语,质量月宣传标语或者是质量标语... 质量月活动,来请专业人士赐教
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com