git 配置多仓库提交,同时维护多个远程仓库,并支持配置代理

git   github   gitlab  
发布于 Aug 29, 2024

git 想必大家都不陌生,但下面 2 种场景您有没有遇到过呢?

1,有一个项目,但是想推到 2 个仓库(例如一个 gitlab,一个 github)

2,网络被禁了,但是有一个中间机器是 ok 的,想做个代理跳板跳出去

如果刚好你也有上述需求或者想储备一下该技能,请往下继续看,建议收藏备用。

git 多仓库提交

多仓库提交常见的有 3 种方式,我一般使用后 2 种(第 2 种较多)

1,使用 git remote add 命令

2,使用 git remote set-url 命令

3,修改配置文件

remote add 命令

使用 git remote add 命令可以添加多个远程仓库关联,特点是可以同时从多个远程仓库去 pull 和 push,缺点也很明显,就是针对每个远程仓库都需要独立的 pull 和 push,pull 和 push 的时候需要指定名称。

这种方式,我感觉还不如弄多个独立的文件夹分别配置独立远程仓库来得方便,更何况大部分情况我们是期待维护一次 push 到多个仓库,保持多个仓库的一致即可,所以此方式仅做了解吧,反正我不用。

下面的操作会顺便补充一点 remote 相关的操作,可以扩充一下技能,比如 rm,rename 之类的。

以下操作以:https://github.com/bytesops/images 为例进行。

# 首先克隆项目到本地
$ git clone git@github.com:bytesops/images.git
$ cd images

# 查看当前项目远程仓库详情
$ git remote -v
origin  git@github.com:bytesops/images.git (fetch)
origin  git@github.com:bytesops/images.git (push)

# 使用如下命令再添加一个远程仓库
$ git remote add gitlab git@gitlab.com:bytesops/images.git

# 再次查看
$ git remote -v
origin  git@github.com:bytesops/images.git (fetch)
origin  git@github.com:bytesops/images.git (push)
gitlab  git@gitlab.com:bytesops/images.git (fetch)
gitlab  git@gitlab.com:bytesops/images.git (push)

# 想把 origin 更改为 github 方便识别
# 演示一下改名
$ git remote rename origin github

# 再次执行
$ git remote -v
github  git@github.com:bytesops/images.git (fetch)
github  git@github.com:bytesops/images.git (push)
gitlab  git@gitlab.com:bytesops/images.git (fetch)
gitlab  git@gitlab.com:bytesops/images.git (push)

# 查看 .git/config 文件可以看到
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[branch "main"]
        remote = github
        merge = refs/heads/main
[remote "gitlab"]
        url = git@gitlab.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/gitlab/*
[remote "github"]
        url = git@github.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/github/*

注意 config 文件中 有 2 哥 remote 块,即对应我们的 2 个远程仓库,而本地 branch 只有一个 main, 并且当前 main 分支默认指向的是 github 远程分支,所以你当前执行 pull 和 push 都是针对的 github.

上面也说了,这种方式如果想同时同步多个分支,需要主动切换

# 切换至 gitlab 远程仓库 将 main 分支 推送到 gitlab 远程仓库
$ git push --set-upstream gitlab main

# 查看 config
$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[branch "main"]
        remote = gitlab
        merge = refs/heads/main
[remote "gitlab"]
        url = git@gitlab.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/gitlab/*
[remote "github"]
        url = git@github.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/github/*

如果再需要切回来,还需要执行

# 切换到远程 github 仓库,将 main 分支推送到 github 仓库
$ git push --set-upstream github main

你学废了吗?

好了,我们先删掉 gitlab 远程分支,我所需要的是我只需要维护 github 分支,gitlab 分支只接受提交即可

# 删掉 gitlab 远程仓库
$ git remote rm gitlab

# 查看
$ git remote -v
github  git@github.com:bytesops/images.git (fetch)
github  git@github.com:bytesops/images.git (push)

remote set-url 命令

使用 set-url --add 方式可以添加多个 push 目标地,符合我们的需求。

$ git remote set-url --add github git@gitlab.com:bytesops/images.git

$ git remote -v
github  git@github.com:bytesops/images.git (fetch)
github  git@github.com:bytesops/images.git (push)
github  git@gitlab.com:bytesops/images.git (push)

$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "github"]
        url = git@github.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/github/*
        url = git@gitlab.com:bytesops/images.git
[branch "main"]
        remote = github
        merge = refs/heads/main

大家可以看到 remote 中有 2 个 push ,pull(fetch) 只会从第一个配置 url 里拉取。

看起来 github 里有个 gitlab 有点怪怪的,还是 rename 一下吧,这才是最终想要的样子。

$ git remote rename github origin

$ git remote -v
origin  git@github.com:bytesops/images.git (fetch)
origin  git@github.com:bytesops/images.git (push)
origin  git@gitlab.com:bytesops/images.git (push)

修改配置文件

这个感觉都不用讲了,上面步骤中都带大家看了 .git/config 文件了,如果不想使用命令操作,直接改配置文件一样的效果,因为最终命令行也是生效到配置文件,你可以体验一步到位的感觉。

$ cat .git/config 

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@github.com:bytesops/images.git
        url = git@gitlab.com:bytesops/images.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
        remote = origin
        merge = refs/heads/main

git 代理配置

如题,工作学习中还会遇到网络不好或者被限制的场景,例如公司限制访问 github ,这时我们毫不迟疑的想到是不是可以使用代哩解决呢?当然可以,一起来体验一下吧。

git clone 有两种形式

1,一个是走 http(s)

2,另一种是 ssh

两种方式的代理设置不一样,两种方式示例如下:

# 使用 ssh 方式(Clone with SSH)
$ git clone git@github.com:bytesops/images.git
# 使用 https 方式(Clone with HTTPS)
$ git clone https://github.com/bytesops/images.git

http 方式

http 代哩设置比较简单:

下面用到的代哩是上一篇文章中配置 docker 拉取镜像介绍过的

# git 设置 https 代哩(上一篇文章中搭建的 polipo 袋里)
$ git config --global https.proxy http://127.0.0.1:8123
# 或者走socks-5 代哩(上一篇文章搭建的 小飞机 客户端端口 1080)
$ git config --global https.proxy socks5://127.0.0.1:1080
# 设置了 https 代哩后即可通过 https 方式 clone 代码
$ git clone https://github.com/bytesops/images.git
# 另附:取消 https 代哩命令,如下
$ git config --global --unset https.proxy

ssh 方式

修改 ~/.ssh/config 文件(不存在则新建)

# 修改~/.ssh/config文件
$ vim ~/.ssh/config

填入以下下配置,注意 方式1(socat)、方式2(nc) 开启一个即可,关于这两种方式,前面的文章也有介绍(可以往前翻一翻)

如当前开启方式2,走 socks5 代理(如 Shadowsocks)

# 必须是 github.com
Host github.com
   HostName github.com
   User git
   # 方式1:走 HTTP 代理
   # ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=8123
   # 方式2:走 socks5 代理(如 Shadowsocks,1080)
   ProxyCommand nc -v -x 127.0.0.1:1080 %h %p

总结

好了,今天主要分享了 git 多仓库提交和 git proxy 相关的知识,内容不多,但是非常实用,应对一些非常规的需求还是很解渴的。

本次的分享到此结束,希望对你有所帮助。

如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!

本文由 黄彦祥 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。