分享我的发现、想法与心得

0%

管理多个远端仓库

下午打算试试gitlab-flow怎样用,弄了两个账号分别fork了主仓,在某个子仓库改完东西后发现我提交不了。用ssh方式的推送代码提示没有授权,看了一下发现用的key没有加上去gogs,后来打算在另一个号加上时提示已经被使用了,看来一个key不能多个号用。这时候问题来了,本地怎样实现不同仓库使用不同key呢?

不同远端使用不同ssh-key

要解决A仓库用A key,B仓库用B key的问题,重点在于ssh的使用上。

ssh能用代理的方式实现不同域用不同的设置,只需实现三步

第一步,设置ssh config

一般情况下在~/.ssh/目录下是没有config文件的,这里先建文件再编辑:

1
2
$ touch ~/.ssh/config
$ vi ~/.ssh/config

然后键入设置的内容

1
2
3
4
5
Host uxfeel.gogs              #代理的域,之后配置远端就用这地址了
User gogs #你的用户名
Hostname gogs.uxfeel.com #host主机的url
IdentityFile ~/.ssh/id_rsa2 #私钥的访问路径
Port 11233 #host主机的端口 如果为80可以忽略此项

原来仓库链接是这样的:ssh://gogs@gogs.uxfeel.com:11233/packy/test.git

用上config后:ssh://uxfeel.com/packy/test.git

到这步可以测试一下是否能访问。

1
$ ssh uxfeel.gogs

输出下面这段就说明正常了。

1
2
3
4
PTY allocation request failed on channel 0
Hi there, You've successfully authenticated, but Gogs does not provide shell access.
If this is unexpected, please log in with password and setup Gogs under another user.
Connection to uxfeel.gogs closed.

第二步,载入你的key

部分git用户会用GUI工具来帮助使用(比如我),这一步载入key是为了给某些GUI工具提供授权的关键(跳过这步,GUI工具同步远端的时候会提示没有权限)。

1
2
# 载入key到ssh-agent
$ ssh-add ~/.ssh/id_rsa2

windows用户注意了

windows用户一般情况下都会使用上git-bash大佬请绕行),运行上面代码会出现提示ssh-agent没有运行。这里需要让git-bash运行的时候同时把ssh-agent带上好了。

~/.profile加上以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi

unset env

重新打开git-bash,agent就会运行。第二步执行不了的代码现在就可以执行。

2020年3月19日更新:

gitkraken在windows下只支持Pageant作为ssh代理,事实是并不行,根本没有效果具体看这个issue

vscdoe 用ssh-agent就能支持,先这样用着。

第三步,修改远端设置

ssh config设置好后,修改仓库远端链接就能正常使用了

1
2
3
4
5
6
7
8
9
10
# 原来的
[remote "origin"]
url = ssh://gogs@gogs.uxfeel.com:11233/packy/test.git
pushurl = ssh://gogs@gogs.uxfeel.com:11233/packy/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
# 改成下面的
[remote "origin"]
url = ssh://uxfeel.gogs/packy/test.git
pushurl = ssh://uxfeel.gogs/packy/test.git
fetch = +refs/heads/*:refs/remotes/origin/*

不同远端使用不同git用户提交

一般用git都离不开全局用户和email的设置这一步:

1
2
$ git config --global user.name "packy"
$ git config --global user.email "lpreterite@126.com"

去掉--global参数就可以给你当前仓库设置指定的用户信息了

1
2
3
# 在 test 仓库目录下运行
$ git config user.name "test"
$ git config user.email "test@126.com"

设置后提交代码的操作用户就会变成test<test@126.com>,通过这样设置就能给不同仓库用不同用户提交代码。

参考