git 在不同服务器主机上同步 git 仓库
参考链接:https://opentechguides.com/how-to/article/git/177/git-sync-repos.html
1.在本地的一个文件夹中执行:
git clone --mirror ssh://[url]/repo_name.git
2.添加一个remote:
cd ropo_name.git
git remote add --mirror=fetch <secondary_romote_name> ssh://[url]/secondary_repo_name.git
注:secondary_repo_name.git 是另外一个服务器上希望同步的git仓库
3.同步
git fetch origin
git push <secondary_remote_name> --all #这是把所有分支都push
如果想单独push一个分支:
git push <secondary_remote_name> <branch>
例如:
git push <secondary_remote_name> master
设置默认的 push,下次只用 git push 即可:
git push -u <secondary_remote_name> master
4.在remote中添加多个可 push 的 url
有时候我们不止有多一个 remote 的 git 仓库,我们希望在 push 一个 remote 的时候,同时更新多个 url
git remote set-url --add --push <secondary_remote_name> <url> #注意:一定要把第一个 url 也执行一次,不然每次push ,只会push 你 add 的那些 url,fetch url 并不会push
git remote set-url --add --push <secondary_remote_name> <url_2>
其实这是在 git config 中添加了相应的内容(蓝色):
[remote "secondary_remote_name"]
url = ssh://[path]/repo_name.git
fetch = +refs/*:refs/*
pushurl = ssh://[path]/repo_name.git
pushurl = ssh://[path_2]/repo_name_2.git
所以我们可以直接在该 remote section 下面复制修改即可,是不是很方便
分析:
通过 --mirror 克隆的是一个 bare repo,里面的内容和服务器的一样,进入仓库后,显示的分支是[BARE:master],在这个文件夹里面,不能使用 work tree 相关的 git 命令,例如 git status,git pull。
secondary_repo_name.git 和 repo_name.git 的内容是完全一致的。