由远程更新和推送引起的Git Repository膨胀

时间:2013-01-07 18:01:36

标签: git push synchronize

我正在研究一种以脚本方式将更改推送到备份服务器的方法。最初的尝试是针对冗余检查。源服务器将其更改推送到远程服务器。作为备份检查,然后在24小时间隔内为生活在远程服务器上的所有存储库运行git远程更新。目标是确保更新可以捕获任何失败/错过或中断的推送。我意识到我会看到本地分支机构和远程分支机构。由于用户没有使用存储库,因此给定的提交与相同的SHA值相关联,并且管理员有一个记录的恢复策略来处理它,我愿意处理添加的分支。让我感到惊讶的是,在运行git branch -a时我没有看到分支加倍,但事实上,存储库大小翻了一番。以下是在所有分支的备份推送之后运行git远程更新的前后影响:

$ du -sk test.git.old /

2419504 test.git.old /

$ du -sk test.git

5120684 test.git

我正在考虑解决这个问题,但问题仍然存在。由于SHA值相同,为什么我看到代码存储了两次而不仅仅是引用现有的SHA值?

2 个答案:

答案 0 :(得分:4)

当您使用自动每日更新时,可能会因为有大量松散的对象而导致某些git对象数据库膨胀。

尝试使用

重新打包您的git对象库
git gc

git gc --aggressive

建议不要经常跑步,但是在蓝色月亮上做一次很好(但很慢)。

在两个repos上执行此操作后,它们的大小应该大致相同。

答案 1 :(得分: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$
相关问题