git:一個本地分支可以對應多個遠程分支么?

背景:本地的一個項目,分別上傳了github/gitlab。本地只有一個master分支,計劃未來git pull/push時不加參數。可以做到一個本地分支分別對應不同的主機上的遠程分支么?一次push,github/gitlab都可以得到更新。


1. init repository 後先加入github

$ git init.
$ git remote add origin git@github.com/username/project

2. 查看 remote 是這樣

$ git remote -v
origin git@github.com/username/project (fetch)
origin git@github.com/username/project (push)

3. 再用 --push 參數加上 gitlab

$ git remote set-url --push --add origin git@gitlab.com/username/project

4. 再查看 remote 可以發現多了一個 push 的位置

$ git remote -v
origin git@github.com/username/project (fetch)
origin git@github.com/username/project (push)
origin git@gitlab.com/username/project (push)

此時當你 git pull origin 就會從 github 拉資料到本地

當你 git push origin 就會同時把資料推到 github 及 gitlab

如果 push 時因故發生一個成功另一個失敗,例如 github push 成功後,gitlab 確發生 ssh key 失效,此時兩個 remote 不同步,解決的方法是單獨 push gitlab

$ git push git@gitlab.com/username/project

此做法有一個缺點,由於只會從 github fetch 資料到本地,所以你用 log 也只看得到本地及 github 的狀態,gitlab 上的狀態無從得知,要嘛你上 gitlab 網站上肉眼比對,要嘛你就嚴格限制 gitlab 就只有你會推資料上去所以"應該"跟github是一致的。


謝邀。

你或許可以在Gitlab或Github設置Hook讓某一個庫更新後自動的Push到另一個庫做到同步。

或者尋找第三方服務,專門做repo同步的。

對於本地直接push到若干個remote的想法,不說能否實現。首先我覺得你這麼偷懶少打不了幾個字,反而養成了不好的習慣。每次顯式的在命令行里描述remote和branch是個很好的習慣,因為萬一你不想把本次臨時分支提交到remote,或者萬一一不小心提交到錯誤的遠程分支又被協作者簽出,都會帶來不必要的麻煩。(當然我不確定你是否用的是命令行操作)

或者說,我多年來的經驗告訴我,不必要的偷懶只會給自己帶來更多的麻煩,浪費更多的時間。。。


大致流程

git remote add xxx

git commit

git push xxx

git push origin

直接git push ,git pull 更新只會更新origin.要省事還是把以上過程用shell包裝一下。以後push和pull都用腳本就是了。


可以先用git remote add建立指向不同遠端的remote,然後封裝一個push函數,最簡陋的譬如git remote | while read line;do git push $line;done。或者同樣簡陋地,把幾條完整的git push命令封裝到一起。之所以說簡陋,是因為沒有錯誤檢查和處理。如果你想要省事,那就盡量自動化,但自動化的同時要盡量把各種可能出現的情況都考慮到,不然容易出錯。


你讓git fetch怎麼辦?


推薦閱讀:

High Flexibility Remote Development
為什麼說「函數式語言是沒有調用棧」的,所謂「函數式語言的思維」又是指什麼呢?
「過分」地追求 OOP 有意義嗎?

TAG:編程 | 計算機 | Git | GitHub |