Kev*_*ker 372 git version-control github
试着从我的计算机上处理我的实际"工作"回购,以及我在git hub上的个人回购.
工作帐户首先设置,一切都完美无瑕.
然而,我的个人帐户似乎无法推送到我的个人仓库,这是根据不同的帐户/电子邮件设置的.
我已经尝试将我的工作密钥复制到我的个人帐户,但这会引发错误,因为密钥只能附加到一个帐户.
如何从他们各自的github凭据中推送/拉出两个帐户?
Pav*_*van 248
您需要做的就是使用多个SSH密钥对配置SSH设置.
这个链接很容易理解(感谢Eric):http: //code.tutsplus.com/tutorials/quick-tip-how-to-work-with-github-and-multiple-accounts--net-22574
生成SSH密钥(Win/msysgit) https://help.github.com/articles/generating-an-ssh-key/
此外,如果您使用不同的角色使用多个存储库,则需要确保您的各个存储库相应地覆盖了用户设置:
设置用户名,电子邮件和GitHub令牌 - 覆盖个人仓库的设置 https://help.github.com/articles/setting-your-commit-email-address-in-git/
希望这可以帮助.
注意:
有些人可能需要不同的电子邮件用于不同的存储库,从git 2.13你可以通过编辑在以下位置找到的全局配置文件来在目录的基础上设置电子邮件:~/.gitconfig使用条件如下:
[user]
name = Pavan Kataria
email = defaultemail@gmail.com
[includeIf "gitdir:~/work/"]
path = ~/work/.gitconfig
Run Code Online (Sandbox Code Playgroud)
然后您的工作特定config~/work/.gitconfig将如下所示:
[user]
email = pavan.kataria@company.tld
Run Code Online (Sandbox Code Playgroud)
感谢@alexg在评论中告知我这一点.
Gre*_*zek 123
使用HTTPS:
将远程URL更改为https:
git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git
Run Code Online (Sandbox Code Playgroud)
你很高兴去:
git push
Run Code Online (Sandbox Code Playgroud)
为了确保提交显示为USERNAME执行,也可以为此项目设置user.name和user.email:
git config user.name USERNAME
git config user.email USERNAME@example.com
Run Code Online (Sandbox Code Playgroud)
Tha*_*you 55
成型
要在单独的github/bitbucket /任何帐户下管理git repo,您只需生成一个新的SSH密钥.
但在此之前,我们可以开始推/拉式回购与你的第二个身份,我们得让你进入形状-假设你的系统是设置具有典型id_rsa和id_rsa.pub密钥对.现在你tree ~/.ssh看起来像这样
$ tree ~/.ssh
/Users/you/.ssh
??? known_hosts
??? id_rsa
??? id_rsa.pub
Run Code Online (Sandbox Code Playgroud)
首先,为密钥对命名 - 添加描述性名称将帮助您记住哪个密钥用于哪个用户/远程
# change to your ~/.ssh directory
$ cd ~/.ssh
# rename the private key
$ mv id_rsa github-mainuser
# rename the public key
$ mv id_rsa.pub github-mainuser.pub
Run Code Online (Sandbox Code Playgroud)
接下来,让我们生成一个新密钥对 - 在这里我将命名新密钥github-otheruser
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser
Run Code Online (Sandbox Code Playgroud)
现在,当我们看到tree ~/.ssh我们看到的时候
$ tree ~/.ssh
/Users/you/.ssh
??? known_hosts
??? github-mainuser
??? github-mainuser.pub
??? github-otheruser
??? github-otheruser.pub
Run Code Online (Sandbox Code Playgroud)
接下来,我们需要设置一个~/.ssh/config定义我们的密钥配置的文件.我们将使用适当的所有者读/写权限创建它
$ (umask 077; touch ~/.ssh/config)
Run Code Online (Sandbox Code Playgroud)
用您喜欢的编辑器打开它,并添加以下内容
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruserRun Code Online (Sandbox Code Playgroud)
据推测,您将有一些与您的主要github身份相关联的现有回购.出于这个原因,"默认"github.com Host设置为使用您的mainuser密钥.如果您不希望某个帐户优先于另一个帐户,我将向您展示如何更新系统上的现有存储库以使用更新的ssh配置.
将新的SSH密钥添加到github
头部到github.com/settings/keys添加新的公共密钥
您可以使用以下方法获取公钥内容:将其复制/粘贴到github
$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...
Run Code Online (Sandbox Code Playgroud)
现在您的新用户身份已全部设置 - 下面我们将向您展示如何使用它.
完成任务:克隆回购
那么这是如何与git和github一起工作的呢?好吧,因为你不能没有鸡蛋和鸡蛋,我们将看看克隆一个现有的回购.如果您的工作场所有新的github帐户,并且您已被添加到公司项目中,则这种情况可能适用于您.
假设github.com/someorg/somerepo已经存在并且您已添加到其中 - 克隆就像一样简单
$ git clone github.com-otheruser:someorg/somerepo.gitRun Code Online (Sandbox Code Playgroud)
该粗体部分必须与Host我们在您的~/.ssh/config文件中设置的名称相匹配.这正确地将git连接到相应的IdentityFile并使用github正确地验证你
完成任务:创建一个新的仓库
好吧,因为你不能没有鸡蛋和鸡蛋,我们会考虑在你的二级账户上发布一个新的回购.这种情况适用于使用其辅助github帐户创建新内容的用户.
让我们假设你已经在本地完成了一些工作,现在你已经准备好推向github了.如果你愿意,你可以跟随我
$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init
Run Code Online (Sandbox Code Playgroud)
现在配置此repo以使用您的身份
$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"
Run Code Online (Sandbox Code Playgroud)
现在进行第一次提交
$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"
Run Code Online (Sandbox Code Playgroud)
检查提交以查看使用git log使用的新身份
$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>
Run Code Online (Sandbox Code Playgroud)
好吧,是时候推向github了!由于github还不知道我们的新回购,首先去github.com/new并创建你的新回购 - 将其命名为somerepo
现在,要使用正确的身份/凭证将您的仓库配置为与github"对话",我们添加了一个远程.假设您的新帐户的github用户名是someuser......
$ git remote add origin github.com-otheruser:someuser/somerepo.gitRun Code Online (Sandbox Code Playgroud)
该粗体部分绝对是关键的,它必须与Host我们在您的~/.ssh/config文件中定义的部分相匹配
最后,推动回购
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
更新现有存储库以使用新的SSH配置
假设您已经克隆了一些repo,但现在您想要使用新的SSH配置.在上面的示例中,我们通过在SSH配置文件中分配您的先前id_rsa/ id_rsa.pub密钥对来保持现有的回购Host github.com.这没有什么不对,但我现在至少有5个github配置,我不喜欢将其中一个配置为"默认"配置 - 我宁愿明确每个配置.
在我们这之前
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Run Code Online (Sandbox Code Playgroud)
所以我们现在将其更新为此(以粗体显示)
Host github.com-mainuser
HostName github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruserRun Code Online (Sandbox Code Playgroud)
但这意味着现在任何带有github.com遥控器的现有仓库将不再使用此身份文件.但不要担心,这是一个简单的解决方案.
要更新任何现有的repo以使用新的SSH配置,只需打开repo的git配置文件并更新url!
$ cd existingrepo
$ nano .git/config
Run Code Online (Sandbox Code Playgroud)
更新远程原点字段(以粗体显示更改)
[remote "origin"]
url = github.com-mainuser:someuser/existingrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*Run Code Online (Sandbox Code Playgroud)
而已.现在你可以push/ pull心灵的内容
SSH密钥文件权限
如果您的公钥无法正常运行时遇到问题,SSH 对您目录中允许的文件权限~/.ssh和相应的密钥文件非常严格
根据经验,任何目录应该是700和任何文件应该是600- 这意味着它们是所有者读/写 - 没有其他组/用户可以读/写它们
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub
Run Code Online (Sandbox Code Playgroud)
我如何管理我的SSH密钥
我为每个连接的主机管理单独的SSH密钥,这样如果任何一个密钥被破坏,我就不必在我使用该密钥的每个其他地方更新密钥.这就像当你从Adobe获得有关其用户信息的1.5亿被盗的通知时 - 现在你必须取消该信用卡并更新依赖它的每项服务 - 这是多么令人讨厌.
这是我的~/.ssh目录的样子:.pem每个用户都有一个密钥,在我连接的每个域的文件夹中.我使用.pem密钥,所以每个密钥只需要一个文件.
$ tree ~/.ssh
/Users/naomik/.ssh
??? config
??? github.com
? ??? naomik.pem
? ??? someusername.pem
??? known_hosts
??? naomi.makes.software
? ??? naomi.pem
??? somedomain.com
? ??? someuser.pem
??? someotherdomain.org
??? someuser.pem
Run Code Online (Sandbox Code Playgroud)
这里是我的相应/.ssh/config文件 - 显然github的内容与回答关于github的这个问题有关,但这个答案旨在让你掌握在任意数量的服务/机器上管理ssh身份的知识.
Host github.com-naomik
HostName github.com
User git
IdentityFile ~/.ssh/github.com/naomik.pem
Host github.com-someuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/someusername.pem
Host naomi.makes.software
User naomi
IdentityFile ~/.ssh/naomi.makes.software/naomi.pem
Host somedomain.com
HostName 162.10.20.30
User someuser
IdentityFile ~/.ssh/somedomain.com/someuser.pem
Host someotherdomain.org
User someuser
IdentityFile ~/.ssh/someotherdomain.org/someuser.pem
Run Code Online (Sandbox Code Playgroud)
从PEM密钥获取SSH公钥
上面你注意到我每个键只有一个文件.当我需要提供公钥时,我只需根据需要生成它.
所以当github请求你的ssh公钥时,运行这个命令将公钥输出到stdout - 在需要的地方复制/粘贴
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...
Run Code Online (Sandbox Code Playgroud)
请注意,这也是我用于将密钥添加到任何远程计算机的过程.该ssh-rsa AAAA...值将复制到远程~/.ssh/authorized_keys文件中
将您的id_rsa/ id_rsa.pub密钥对转换为PEM格式
所以你想驯服你的关键文件并减少一些文件系统的残缺?将密钥对转换为单个 PEM非常简单
$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem
Run Code Online (Sandbox Code Playgroud)
或者,随着我们的例子上面,下面我们改名id_rsa -> github-mainuser和id_rsa.pub -> github-mainuser.pub-所以
$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem
Run Code Online (Sandbox Code Playgroud)
现在只是为了确保我们已将此转换为正确,您将需要验证生成的公钥是否与您的旧公钥匹配
# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
Run Code Online (Sandbox Code Playgroud)
现在您拥有了自己的github-mainuser.pem文件,可以安全地删除旧文件github-mainuser和github-mainuser.pub文件 - 只需要PEM文件; 只需在需要时生成公钥^ _ ^
从头开始创建PEM密钥
您无需创建私钥/公钥对,然后转换为单个PEM密钥.您可以直接创建PEM密钥.
让我们创建一个 newuser.pem
$ openssl genrsa -out ~/.ssh/newuser.pem 4096
Run Code Online (Sandbox Code Playgroud)
获取SSH公钥是一样的
$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==
Run Code Online (Sandbox Code Playgroud)
小智 24
通过在〜/ .ssh/config中为github.com创建不同的主机别名,并为每个主机别名提供自己的ssh密钥,您可以轻松地使用多个github帐户而不会产生混淆.那是因为github.com不是用户区分的,它总是只是git,而是用你用来连接的ssh键.只需使用自己的主机别名配置远程起源."
上述摘要由以下博客文章中的评论提供.
我发现这个解释最清楚了.它对我有用,至少截至2012年4月.
http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts/
Mat*_*ton 22
来自mishaba的http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts/的详细信息对我来说非常有用.
从该页面:
$ touch ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)
然后将该文件编辑为类似的内容(每个帐户一个条目):
#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
Host github-COMPANY
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_COMPANY
Run Code Online (Sandbox Code Playgroud)
MK.*_*MK. 22
就我而言,我在 Git-Lab 中有工作帐户,在 GitHub 中有个人帐户。我的 Git-Lab 帐户已全局配置为可以从笔记本电脑中的所有目录进行访问,如下所示:
git config --global user.name WORK_USERNAME
git config --global user.email WORK_USERNAME@example.com
Run Code Online (Sandbox Code Playgroud)
因此,如果您正在寻找不使用 SSL 的解决方案,您可以通过git init在空文件夹中使用来实现,然后在该文件夹中插入您的个人帐户凭据:
git config user.name PERSONAL_USERNAME
git config user.email PERSONAL_USERNAME@example.com
Run Code Online (Sandbox Code Playgroud)
请注意,此处--global未设置,因为您只希望从那里访问您的个人 git,而不是在任何地方访问,因此该文件夹内的任何内容都将其 git 凭据连接到您的个人帐户,而其外部的 git 凭据将连接到您的工作帐户。
之后,您可以像这样克隆您的存储库git clone your_repo_link.git。然后会弹出一个新窗口并要求您使用 github 帐户登录。
要验证您的过程,请git config --list在您创建的文件夹中尝试,您应该看到工作和个人用户名以及电子邮件及其目录。
在该文件夹之外,如果您运行,git config --list您应该只能看到您的工作用户名和电子邮件。
就是这样,希望这对没有配置 SSL 的人有所帮助。
Dav*_*d H 11
我使用shell脚本将我切换到我想要"活跃"的任何帐户.基本上,您从一个全新的开始,正确配置一个帐户并运行,然后将这些文件移动到具有正确前缀的名称.从那时起,您可以使用命令"github"或"gitxyz"来切换:
# my github script
cd ~/.ssh
if [ -f git_dhoerl -a -f git_dhoerl.pub -a -f config_dhoerl ]
then
;
else
echo "Error: missing new files"
exit 1
fi
# Save a copy in /tmp, just in case
cp id_rsa /tmp
cp id_rsa.pub /tmp
cp config /tmp
echo "Saved old files in /tmp, just in case"
rm id_rsa
rm id_rsa.pub
rm config
echo "Removed current links/files"
ln git_dhoerl id_rsa
ln git_dhoerl.pub id_rsa.pub
ln config_dhoerl config
git config --global user.email "dhoerl@<company>.com"
git config --global github.user "dhoerl"
git config --global github.token "whatever_it_is"
ssh-add -D
Run Code Online (Sandbox Code Playgroud)
我对此很幸运.我还在Xcode(为你的Mac用户)创建了一个运行脚本,所以它不会构建我的项目,除非我有正确的设置(因为它使用git):
在Dependencies之后运行脚本(使用/ bin/ksh作为shell):
if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ]
then
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
编辑:添加新文件存在的测试和复制旧文件到/ tmp以通过@naomik下面的注释.
Pra*_*V R 11
打开配置文件并添加以下代码.(根据您的帐户更改)
帐户1
# account_1
Host gitlab.com-account_1
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_account_1
Run Code Online (Sandbox Code Playgroud)帐户2
# Account2
Host gitlab.com-Account2
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_Account2
Run Code Online (Sandbox Code Playgroud)帐户3
# Account_3
Host github.com-Account3
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_Account_3
Run Code Online (Sandbox Code Playgroud)添加远程URL如下
帐户1
git remote add origin git@gitlab.com-account_1:group_name/repo_name.git
Run Code Online (Sandbox Code Playgroud)帐户2
git remote add origin git@gitlab.com-Account2:group_name/repo_name.git
Run Code Online (Sandbox Code Playgroud)帐户3
git remote add origin github.com-Account3:github_username/repo_name.git
Run Code Online (Sandbox Code Playgroud)确保IdentityFile名称与在ssh密钥生成期间创建的名称相同.
这个答案适合初学者(非git大师).我最近有这个问题,也许它只是我,但大多数答案似乎需要相当提前了解git.在阅读了包含此主题的几个堆栈溢出答案之后,以下是我需要采取的步骤,以便在GitHub帐户之间轻松切换(例如假设两个GitHub帐户,github.com/personal和gitHub.com/work):
ls -al ~/.ssh .pub是您的ssh密钥,因此您应该有两个用于personal和work帐户.如果只有一个或没有,那么生成其他明智的时间就跳过这个.ssh-keygen -t rsa -C "the copied email",你会看到:/.../.ssh/id_rsa_work当发电工作帐户.提供密码或只是输入忽略,你会读到像钥匙的randomart图像是:和图像.完成.ls -al ~/.ssh再次运行时看到两个ssh键.pbcopy < ~/.ssh/id_rsa_work.pub替换id_rsa_work.pub为您所谓的ssh密钥.id_rsa_work]并导航到编辑全局git配置:最后一步是确保全局配置文件知道所有github帐户(可以这么说).
运行git config --global --edit以编辑此全局文件,如果打开vim并且您不知道如何使用它,请按i进入插入模式,按如下所示编辑文件,然后按esc :wq键退出插入模式:
[inside this square brackets give a name to the followed acc.]
name = github_username
email = github_emailaddress
[any other name]
name = github_username
email = github_email
[credential]
helper = osxkeychain
useHttpPath = true
完成!,现在当你试图从回购中推或拉时,你会被问到哪个GitHub帐户应该与这个回购链接,并且只询问一次,本地配置会记住这个链接,而不是全局配置,这样你就可以工作了在不同的回购中,与不同的帐户链接,而不必每次都编辑全局配置.
刚刚为 Windows 解决了这个问题,使用每个 repo 的凭据:
cd c:\User1\SomeRepo
git config --local credential.https://github.com.user1 user1
git config --local credential.useHttpPath true
git config --local credential.helper manager
git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git
Run Code Online (Sandbox Code Playgroud)
凭证的格式。https://github.com。告诉凭证助手凭证的 URL。'useHttpPath' 告诉凭证管理器使用凭证的路径。如果省略 useHttpPath ,则凭证管理器将为https://github.com存储一个凭证。如果包含它,那么凭证管理器将存储多个凭证,这正是我真正想要的。
有很多答案解释了如何完成您所要求的任务,但我想提供不同的观点。
我认为将工作和个人事务分开是有道理的。在所有操作系统上的用户帐户之间切换非常简单,因此您只需为工作和娱乐创建单独的操作系统帐户,并在每个帐户中登录不同的 github 帐户即可。
保持清晰的关注点分离还可以...
我在这里看到了很多可能的解决方法。作为一种快速解决方案,@Greg 的解决方案似乎相对简单。ssh keys但是,从长远来看,最好为所有不同的帐户单独设置。该视频简要演示了这一点。以下是该视频博客中提到的步骤。
步骤 1 - 为新帐户创建新的 SSH 密钥并将其保存在单独的文件中(例如 ~/.ssh/id_rsa_new_account_name),而不是原始文件中,即~/.ssh/id_rsa
ssh-keygen -t rsa -C "your-email-address"
Run Code Online (Sandbox Code Playgroud)
第 2 步 - 附上新密钥
Account Overview附加新密钥。~/.ssh/id_rsa_new_account_name.pubSSH Public Keysssh-add ~/.ssh/id_rsa_new_account_name。如果成功,您将看到 的响应Identity Added。第 3 步 - 创建配置文件
touch ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)
并将以下内容保存到文件中
#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
#New Account
Host github-new-account-name
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_new_account_name
Run Code Online (Sandbox Code Playgroud)
第 4 步 - 现在尝试一下, 每次您想要使用新帐户和关联的存储库时,请为相应的存储库键入此内容
git remote add origin git@github-new-account-name:your-domain.com/your-repo.git
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
183931 次 |
| 最近记录: |