你是正確的,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$
你能舉一個你的push命令的例子嗎?您不應該創建新的分支作爲備份操作的一部分。備用/更簡單的設置可能是將備份存儲庫視爲另一個客戶端。 –
git push remote-alias branch-name是的,如果在原始用戶推送到存儲庫期間創建了一個新分支,我將創建一個新分支。我需要捕獲並備份給定存儲庫的所有分支。 –
你知道第二個repo目錄的大小超過了兩倍,但你不知道「代碼被存儲了兩次」。 Git對象具有唯一的sha-1鍵,不會存儲兩次。您可能需要檢查意外的.git文件夾,或者嘗試使用「git gc」來優化磁盤使用情況。 –