# Git 维护

**URL:** <https://www.isharkfly.com/t/git/10967>\
**Category:** 软件技术\
**Created:** [April 4, 2015, 5:20am UTC](https://www.isharkfly.com/t/git/10967 "2015-04-04T05:20:48Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [April 4, 2015, 5:20am UTC](https://www.isharkfly.com/t/git/10967/1 "2015-04-04T05:20:48Z")

</div>

Git 会不定时地自动运行称为 “auto gc” 的命令。大部分情况下该命令什么都不处理。不过要是存在太多松散对象 (loose object, 不在 packfile 中的对象) 或 packfile，Git 会进行调用 git gc 命令。 gc 指垃圾收集 (garbage collect)，此命令会做很多工作：收集所有松散对象并将它们存入 packfile，合并这些 packfile 进一个大的 packfile，然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。  
可以手工运行 auto gc 命令：

```auto
$ git gc --auto
```

再次强调，这个命令一般什么都不干。如果有 7,000 个左右的松散对象或是 50 个以上的 packfile，Git 才会真正调用 gc 命令。可能通过修改配置中的 gc.auto 和 gc.autopacklimit 来调整这两个阈值。  
gc 还会将所有引用 (references) 并入一个单独文件。假设仓库中包含以下分支和标签：

`$ find .git/refs -type f
.git/refs/heads/experiment
.git/refs/heads/master
.git/refs/tags/v1.0
.git/refs/tags/v1.1`

这时如果运行 git gc, refs 下的所有文件都会消失。Git 会将这些文件挪到 .git/packed-refs 文件中去以提高效率，该文件是这个样子的：

[code]$ cat .git/packed-refs

# pack-refs with: peeled

cac0cab538b970a37ea1e769cbbde608743bc96d refs/heads/experiment  
ab1afef80fac8e34258ff41fc1b867c702daa24b refs/heads/master  
cac0cab538b970a37ea1e769cbbde608743bc96d refs/tags/v1.0  
9585191f37f7b0fb9444f35a9bf50de191beadc2 refs/tags/v1.1  
^1a410efbd13591db07496601ebc7a059dd55cfe9[/code]

当更新一个引用时，Git 不会修改这个文件，而是在 refs/heads 下写入一个新文件。当查找一个引用的 SHA 时，Git 首先在 refs 目录下查找，如果未找到则到 packed-refs 文件中去查找。因此如果在 refs目录下找不到一个引用，该引用可能存到 packed-refs 文件中去了。

请留意文件最后以 ^ 开头的那一行。这表示该行上一行的那个标签是一个 annotated 标签，而该行正是那个标签所指向的 commit 。

REF:[http://cwiki.ossez.com/pages/viewpage.action?pageId=7045962](http://cwiki.ossez.com/pages/viewpage.action?pageId=7045962)
