【问题标题】:Git Repository bloat caused by remote update and push远程更新和推送导致的 Git 存储库膨胀
【发布时间】:2013-01-07 18:01:35
【问题描述】:

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

$ du -sk test.git.old/

2419504 test.git.old/

$ du -sk test.git

5120684 测试.git

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

【问题讨论】:

  • 你能举一个你的推送命令的例子吗?您不应该在备份操作中创建新分支。另一种/更简单的设置可能是将备份存储库视为另一个客户端。
  • git push remote-alias branch-name 所以是的,如果在原始用户推送到存储库期间创建了一个新分支,我将创建一个新分支。我需要捕获并备份给定存储库的所有分支。
  • 您知道第二个 repo 目录的大小超过了两倍,但您不知道“代码存储了两次”。 Git 对象具有唯一的 sha-1 键并且不会存储两次。您可能需要检查意外的额外 .git 文件夹,或者尝试“git gc”以优化磁盘使用率。

标签: git push synchronize


【解决方案1】:

当您使用自动每日更新时,由于有很多松散的对象,可能会导致一些 git 对象数据库膨胀。

尝试使用重新打包你的 git 对象库

git gc

git gc --aggressive

Aggressive 不建议定期运行,但在蓝月亮中进行一次就可以了(但很慢)。

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

【讨论】:

    【解决方案2】:

    你是对的,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$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2015-11-21
      • 2011-05-05
      相关资源
      最近更新 更多