如何同步多個 git 遠程倉庫


日常需求

以前源碼是托管在 github 的, 現在想要同步托管在 gitee, 一做備份分發, 二方便國內下載使用(網速可觀), 三防特色牆...

方式一 使用 gitee 的強制同步

之前在 github 托管了這么一個項目 mirrors-in-china,
后來國內出了 gitee, 那么想着把項目同步一份到 gitee, 方便大家查看...
正巧 gitee 提供強制同步功能, 方便操作...

我還是只用維護 github 那份源碼, gitee 這邊沒忘記的話, 手搓點擊下強制同步按鈕即可.

但是容易忘記, 造成兩邊不完全同步.

不過我這個項目本身就非常簡單, 這點同步時差完全沒大問題, 夠用, 並且沒有其他任何多余的操作.

方式二 手搓 push 多次

換另一個項目來說, 我之前在 github 托管了這么一個項目 GlobalScanner.Sdk,
應廣大小伙伴需求, 希望把項目在國內同步一份, 方便下載/參考/使用.

那么不外乎就是配置多個遠程庫地址, 多次推送咯, 那么我們先來看看現有遠程庫的情況:

$ git remote --verbose
origin  git@github.com:taadis/GlobalScanner.Sdk.git (fetch)
origin  git@github.com:taadis/GlobalScanner.Sdk.git (push)

可以看到目前僅有 git@github.com:taadis/GlobalScanner.Sdk.git 這個遠程庫地址.

我們來加一個 gitee 的遠程地址, 首先在 gitee 建好同步倉庫, 然后我們在本地添加一個新的遠程庫地址:

$ git remote add giteeorigin git@gitee.com:taadis/GlobalScanner.Sdk.git

添加完成后我們查看一下:

$ git remote --verbose
giteeorigin     git@gitee.com:taadis/GlobalScanner.Sdk.git (fetch)
giteeorigin     git@gitee.com:taadis/GlobalScanner.Sdk.git (push)
origin  git@github.com:taadis/GlobalScanner.Sdk.git (fetch)
origin  git@github.com:taadis/GlobalScanner.Sdk.git (push)

可以查看到以下2個遠程庫地址:

  • giteeorigin: 是我們新加的 gitee 的遠程庫地址
  • origin: 是我們之前在 github 的遠程庫地址

接下來同步:

git add .
git commit -m "add gitee"
git push -u origin master
git push -u giteeorigin master

有鏈接有真相:

比之前多個一次 git push 操作...其他和之前沒有太大區別...沒有更多的心智負擔.

但是經常容易忘記...

方式三 最多跑一次

不想着法偷懶的 coder 不是好程序員, 秉承 "最多跑一次" 的理念, 讓我們試試怎么一次 push 統統搞定.

在本地 git 倉庫里找到這個文件 .git/config, 內容如下:

[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[remote "origin"]
	url = git@github.com:taadis/GlobalScanner.Sdk.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master
[remote "giteeorigin"]
	url = git@gitee.com:taadis/GlobalScanner.Sdk.git
	fetch = +refs/heads/*:refs/remotes/giteeorigin/*

改為如下:

合並2個 remote 配置

[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[remote "origin"]
	url = git@github.com:taadis/GlobalScanner.Sdk.git
	url = git@gitee.com:taadis/GlobalScanner.Sdk.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

上面這個手動配置是為了更好的說明而已, 其實可以用以下命令簡化操作, 在 origin 節點下補充了一個新的遠程地址.

$ git remote set-url --add origin git@gitee.com:taadis/GlobalScanner.Sdk.git

看看補充后的遠程地址情況

git remote --verbose
origin  git@github.com:taadis/GlobalScanner.Sdk.git (fetch)
origin  git@github.com:taadis/GlobalScanner.Sdk.git (push)
origin  git@gitee.com:taadis/GlobalScanner.Sdk.git (push)

注意看后面的 (fetch)(push), 相信你會明白點什么.

然后我們可以繼續這樣使用來實現 github & gitee 的同步推送和分發:

git add .
git commit -m "github & gitee 同步推送和分發"
git push origin master

有鏈接有真相:

可以看到, 使用上和最初沒有任何區別, 只是多配置了一次, 算是實現了 "最多配(跑)一次".

總而言之

幾種方式, 各取所需咯.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM