如何同時用多個 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
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
git log 出來看,2.txt 己 sync
從以上來看, mirror 及 main repository 可以很彈性的 sync
你好方便跟你諮詢個問題嗎
回覆刪除若我有三台不同ip Git Server
我要如何做到當使用者push to a server , a server 轉push 到b/c呢?
看了許多文章都是採用設定remote, 但不希望用此做法
而是想讓server 收到push自動轉發
若我沒有意會錯誤的話,您是想 A server 自動偵測到後傳到 B, C server 吧。
刪除首先表明一下,跟 SQL Server這類服務型伺服器不一樣的是 git repository 只一個倉儲,只是純粹儲存的地方而已,並不需要 service 。所以他就無法幫你做東做西的...
若您想要達成該需求,並且不能用設 remote 方式,我只能建議用 crontab 等排程工具進行。
我本身有用 users -- 上傳 --> repo Server --手動sync--> backup repo
sync 這端其實是一個 shell script, 只差在沒放到 cron 上自動執行