2013-01-07 30 views
0

我正在尋找一種以腳本方式將更改推送到備份服務器的方法。最初的嘗試是針對重複檢查。源服務器將其更改推送到遠程服務器。作爲備份檢查,然後以24小時爲間隔爲遠程服務器上的所有存儲庫運行git遠程更新。目標是確保任何失敗/錯過或中斷的推送將被更新捕獲。我意識到我會看到當地的分支機構和遠程分支機構。由於用戶沒有使用存儲庫,給定的提交與相同的SHA值相關聯,並且管理員有文檔化的恢復策略來處理它,所以我願意處理添加的分支。讓我感到驚訝的是,我在運行git branch -a時不僅看到了分支的翻倍,實際上,存儲庫大小翻了一番。下面是之前和影響所有分支機構的備份推後運行git遠程更新後:由遠程更新和推動造成的Git倉庫膨脹

$杜-sk test.git.old/

2419504 test.git.old/

$杜-sk test.git

5120684 test.git

我在尋找解決此工作,但仍然是問題。由於SHA值相同,爲什麼我看到代碼存儲了兩次而不是僅引用現有的SHA值?

+0

你能舉一個你的push命令的例子嗎?您不應該創建新的分支作爲備份操作的一部分。備用/更簡單的設置可能是將備份存儲庫視爲另一個客戶端。 –

+0

git push remote-alias branch-name是的,如果在原始用戶推送到存儲庫期間創建了一個新分支,我將創建一個新分支。我需要捕獲並備份給定存儲庫的所有分支。 –

+0

你知道第二個repo目錄的大小超過了兩倍,但你不知道「代碼被存儲了兩次」。 Git對象具有唯一的sha-1鍵,不會存儲兩次。您可能需要檢查意外的.git文件夾,或者嘗試使用「git gc」來優化磁盤使用情況。 –

回答

4

當您使用自動日常更新時,可能會因爲有大量鬆散對象而導致某些git對象數據庫膨脹。

嘗試使用

git gc 

git gc --aggressive 

積極不建議定期運行重新包裝你的git的對象存儲,但在一個藍色的月亮做一次是罰款(但很慢)。

當你在這兩個回購站做到這一點後,它們的大小應該大致相同。

0

你是正確的,git將只存儲每個sha-1散列的一個對象。但是,git會以不同的方式存儲對象(以及不同的大小),具體取決於它是否被打包。 「git gc」是強制垃圾收集和減少存儲庫大小的常用方式。僅僅因爲一個存儲庫更大並不意味着它正在複製對象。一個「光禿禿的」回購也將更小,一個工作回購。

爲了實現遠程服務器存儲庫備份存儲庫的更廣泛目標,您可以像任何其他開發人員一樣備份「git pull」。請記住,克隆的存儲庫(最新)將包含複製「服務器」的所有信息。

一個想法,我想出了您(不直接使用)是構建這樣的設置:

developer 1 repo -----> repo.server (bare) <--- repo.backup (bare mirror) 
          ^
developer 2 repo -----------| 

如果你的設置是這樣的,你會很容易有你「服務器的鏡像「存儲庫,如果您的」服務器「回購丟失,可以在以後直接使用。

我做了一個奔跑(下),因爲這是我第一次嘗試鏡像技術。就我而言,沒有存儲庫「膨脹」。但是,你可能有不同的git命令,所以比較起來會很有用。

$ mkdir repo.local 
$ mkdir repo.server 
$ mkdir repo.backup 
$ git init repo.local/  # initial repo 
Initialized empty Git repository in /home/username/code/gittest/repo.local/.git/ 
$ cd repo.local/ 
repo.local$ dd if=/dev/urandom of=garbage.dat bs=1M count=2 # 2MB random file 
2+0 records in 
2+0 records out 
2097152 bytes (2.1 MB) copied, 0.486459 s, 4.3 MB/s 
repo.local$ git add garbage.dat 
repo.local$ git commit -m "+ added 2MB file" 
[master (root-commit) 0664e21] + added 2MB file 
1 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 garbage.dat 
repo.local$ cd .. 
$ git init --bare repo.server/  # bare server repo 
Initialized empty Git repository in /home/username/code/gittest/repo.server/ 
$ cd repo.local/ 
repo.local$ git push ../repo.server/ master # push to bare repo 
Counting objects: 3, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 2.00 MiB, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To ../repo.server/ 
* [new branch]  master -> master 
repo.local$ # add repo.server as origin remote, just as if repo.local was a clone of repo.server 
repo.local$ git remote add origin /home/username/code/gittest/repo.server/ 
repo.local$ git pull origin master 
From /home/username/code/gittest/repo.server 
* branch   master  -> FETCH_HEAD 
Already up-to-date. 
repo.local$ cd .. 
$ git push --mirror repo.backup/ 
fatal: Not a git repository (or any of the parent directories): .git 
$ git init --bare repo.backup/ # bare server repo 
Initialized empty Git repository in /home/username/code/gittest/repo.backup/ 
$ git push --mirror repo.backup/ 
fatal: Not a git repository (or any of the parent directories): .git 
$ cd repo.server/ 
repo.server$ git push --mirror ../repo.backup/ 
Counting objects: 3, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 2.00 MiB, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To ../repo.backup/ 
* [new branch]  master -> master 
repo.server$ cd .. 
$ du -sk repo.* 
2180 repo.backup 
4272 repo.local 
2180 repo.server 
$ cd repo.local/ 
repo.local$ git checkout -b topic1 
Switched to a new branch 'topic1' 
repo.local$ dd if=/dev/urandom of=garbage.dat bs=1M count=3 # 3MB random file 
3+0 records in 
3+0 records out 
3145728 bytes (3.1 MB) copied, 0.729684 s, 4.3 MB/s 
repo.local$ git add . 
repo.local$ git commit -m "+ revision 2" 
[topic1 d9d12d6] + revision 2 
1 files changed, 12161 insertions(+), 8105 deletions(-) 
rewrite garbage.dat (67%) 
repo.local$ git branch -a 
    master 
* topic1 
repo.local$ git push origin topic1 
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 3.00 MiB, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /home/username/code/gittest/repo.server/ 
* [new branch]  topic1 -> topic1 
repo.local$ git pull origin topic1 
From /home/username/code/gittest/repo.server 
* branch   topic1  -> FETCH_HEAD 
Already up-to-date. 
repo.local$ git branch -a 
    master 
* topic1 
    remotes/origin/master 
    remotes/origin/topic1 
repo.local$ cd .. 
$ du -sk repo.* 
2180 repo.backup 
8436 repo.local 
5284 repo.server 
$ cd repo.server/          
repo.server$ git push --mirror ../repo.backup/   
Counting objects: 5, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 3.00 MiB, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To ../repo.backup/ 
* [new branch]  topic1 -> topic1 
repo.server$ cd .. 
$ du -sk repo.* 
5284 repo.backup 
8436 repo.local 
5284 repo.server 
$ cd repo.server/ 
repo.server$ git branch -a 
* master 
    topic1 
repo.server$ cd ../repo.backup/ 
repo.backup$ git branch -a 
* master 
    topic1 
repo.backup$