如何同步多個 git 遠程倉庫

平常需求

之前源碼是託管在 github 的, 如今想要同步託管在 gitee, 一作備份分發, 二方便國內下載使用(網速可觀), 三防特點牆...git

方式一 使用 gitee 的強制同步

以前在 github 託管了這麼一個項目 mirrors-in-china, 後來國內出了 gitee, 那麼想着把項目同步一份到 gitee, 方便你們查看... 正巧 gitee 提供強制同步功能, 方便操做...程序員

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

可是容易忘記, 形成兩邊不徹底同步.fetch

不過我這個項目自己就很是簡單, 這點同步時差徹底沒大問題, 夠用, 而且沒有其餘任何多餘的操做.url

方式二 手搓 push 屢次

換另外一個項目來講, 我以前在 github 託管了這麼一個項目 GlobalScanner.Sdk, 應廣大小夥伴需求, 但願把項目在國內同步一份, 方便下載/參考/使用.3d

那麼不外乎就是配置多個遠程庫地址, 屢次推送咯, 那麼咱們先來看看現有遠程庫的狀況:code

$ 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 這個遠程庫地址.orm

咱們來加一個 gitee 的遠程地址, 首先在 gitee 建好同步倉庫, 而後咱們在本地添加一個新的遠程庫地址:blog

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

添加完成後咱們查看一下:rem

$ 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

有連接有真相:

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

總而言之

幾種方式, 各取所需咯.

相關文章
相關標籤/搜索