2014-11-24

如何同時用多個 git bare repository來管理你的專案並同步

無論是何原因,假設你想用多個repository來管理你的專案,
如何同時用多個 git bare repository來管理你的專案並同步呢?
一句話,
如果你需要多個 git repository (相同的git專案), 那麼你需要用 --mirror 命令列去複製主 repository

例如:

狀況一:master repository --clone--> mirror repository,再由 mirror --create-->project
                project commit --sync back--> mirror --sync back--> master
建立主要 repository
$ mkdir main_repo
$ cd main_repo/
main_repo$ git init --bare

Initialized empty Git repository in /Users/user/temp/main_repo/



建立mirror repository from master(main) repository
$ git clone --mirror main_repo/ branch_repo
Cloning into bare repository 'branch_repo'...
warning: You appear to have cloned an empty repository.

done.

mirror --create--> developing project
從 mirror repository clone 到開發專案區
經編輯後上傳同步回 mirror
$ git clone branch_repo/ branch_working
Cloning into 'branch_working'...
warning: You appear to have cloned an empty repository.
done.
$ cd branch_working/
branch_working$ touch 1.txt
branch_working$ git add .
branch_working$ git commit -a -m "add 1.txt"
[master (root-commit) 7cf8070] add 1.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.txt

上傳回 mirror
$ git push origin master

回 mirror 站看內容,有更新
$ cd ..
$ cd branch_repo/
branch_repo$ git log
commit 7cf80708eadc22df7844b9d1914b552d3b4cad64

此時若 mirror 要回傳 main , 只要 git push 回去即可
branch_repo$ git push 
Counting objects: 3, done.
Writing objects: 100% (3/3), 202 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)




狀況二:master --clone--> mirror --> project,假設mirror目前有問題,我們可以直接commit回master
                project commit --> add remote(master)  --push to master--> master


master --clone--> mirror --> project 請參考上方

在 working 的專案修改並 commit
branch_working$ touch 2.txt
branch_working$ git add .
branch_working$ git commit -a -m "add 2.txt"
[master 5678cfa] add 2.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 2.txt

我們可以 add remote 建立 new remote,再回傳new remote
branch_working$ git remote add mybase /Users/user/temp/main_repo/ 
branch_working$ git push mybase master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 229 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To /Users/user/temp/main_repo/
   7cf8070..5678cfa  master -> master

這時 master(main) repository 跟 project repository 已經同步。
那麼 mirror 要怎麼同步呢?
切到 mirror(branch_repo),只要下 git fetch 即可
branch_repo$ git fetch
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
From /Users/user/temp/main_repo
   7cf8070..5678cfa  master     -> master
branch_repo$ git log
commit 5678cfad38f70a8210f3d6a44dd4184cc9f15b22
Author: 
Date:   Mon Nov 24 19:05:18 2014 +0800

    add 2.txt

git log 出來看,2.txt 己 sync

從以上來看, mirror 及 main repository 可以很彈性的 sync










2 則留言:

  1. 你好方便跟你諮詢個問題嗎
    若我有三台不同ip Git Server
    我要如何做到當使用者push to a server , a server 轉push 到b/c呢?
    看了許多文章都是採用設定remote, 但不希望用此做法
    而是想讓server 收到push自動轉發

    回覆刪除
    回覆
    1. 若我沒有意會錯誤的話,您是想 A server 自動偵測到後傳到 B, C server 吧。

      首先表明一下,跟 SQL Server這類服務型伺服器不一樣的是 git repository 只一個倉儲,只是純粹儲存的地方而已,並不需要 service 。所以他就無法幫你做東做西的...
      若您想要達成該需求,並且不能用設 remote 方式,我只能建議用 crontab 等排程工具進行。
      我本身有用 users -- 上傳 --> repo Server --手動sync--> backup repo
      sync 這端其實是一個 shell script, 只差在沒放到 cron 上自動執行

      刪除