Skip to content
Snippets Groups Projects
git-gc.txt 6.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    git-gc(1)
    =========
    
    NAME
    ----
    git-gc - Cleanup unnecessary files and optimize the local repository
    
    
    SYNOPSIS
    --------
    [verse]
    
    'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune] [--force] [--keep-largest-pack]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    DESCRIPTION
    -----------
    Runs a number of housekeeping tasks within the current repository,
    such as compressing file revisions (to reduce disk space and increase
    
    performance), removing unreachable objects which may have been
    created from prior invocations of 'git add', packing refs, pruning
    reflog, rerere metadata or stale working trees. May also update ancillary
    indexes such as the commit-graph.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    When common porcelain operations that create objects are run, they
    will check whether the repository has grown substantially since the
    last maintenance, and if so run `git gc` automatically. See `gc.auto`
    below for how to disable this behavior.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Running `git gc` manually should only be needed when adding objects to
    a repository without regularly running such porcelain commands, to do
    a one-off repository optimization, or e.g. to clean up a suboptimal
    mass-import. See the "PACKFILE OPTIMIZATION" section in
    linkgit:git-fast-import[1] for more details on the import case.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    OPTIONS
    -------
    
    --aggressive::
    	Usually 'git gc' runs very quickly while providing good disk
    	space utilization and performance.  This option will cause
    	'git gc' to more aggressively optimize the repository at the expense
    	of taking much more time.  The effects of this optimization are
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	mostly persistent. See the "AGGRESSIVE" section below for details.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    --auto::
    	With this option, 'git gc' checks whether any housekeeping is
    	required; if not, it exits without performing any work.
    +
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    See the `gc.auto` option in the "CONFIGURATION" section below for how
    this heuristic works.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Once housekeeping is triggered by exceeding the limits of
    configuration options such as `gc.auto` and `gc.autoPackLimit`, all
    
    other housekeeping tasks (e.g. rerere, working trees, reflog...) will
    be performed as well.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    --[no-]cruft::
    
    	When expiring unreachable objects, pack them separately into a
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	cruft pack instead of storing them as loose objects. `--cruft`
    	is on by default.
    
    --max-cruft-size=<n>::
    	When packing unreachable objects into a cruft pack, limit the
    	size of new cruft packs to be at most `<n>` bytes. Overrides any
    	value specified via the `gc.maxCruftSize` configuration. See
    	the `--max-cruft-size` option of linkgit:git-repack[1] for
    	more.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    --prune=<date>::
    	Prune loose objects older than date (default is 2 weeks ago,
    	overridable by the config variable `gc.pruneExpire`).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	--prune=now prunes loose objects regardless of their age and
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	increases the risk of corruption if another process is writing to
    	the repository concurrently; see "NOTES" below. --prune is on by
    	default.
    
    --no-prune::
    	Do not prune any loose objects.
    
    --quiet::
    	Suppress all progress reports.
    
    --force::
    	Force `git gc` to run even if there may be another `git gc`
    	instance running on this repository.
    
    
    --keep-largest-pack::
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	All packs except the largest non-cruft pack, any packs marked
    	with a `.keep` file, and any cruft pack(s) are consolidated into
    	a single pack. When this option is used, `gc.bigPackThreshold`
    	is ignored.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    AGGRESSIVE
    ----------
    
    When the `--aggressive` option is supplied, linkgit:git-repack[1] will
    be invoked with the `-f` flag, which in turn will pass
    `--no-reuse-delta` to linkgit:git-pack-objects[1]. This will throw
    away any existing deltas and re-compute them, at the expense of
    spending much more time on the repacking.
    
    The effects of this are mostly persistent, e.g. when packs and loose
    objects are coalesced into one another pack the existing deltas in
    that pack might get re-used, but there are also various cases where we
    might pick a sub-optimal delta from a newer pack instead.
    
    Furthermore, supplying `--aggressive` will tweak the `--depth` and
    `--window` options passed to linkgit:git-repack[1]. See the
    `gc.aggressiveDepth` and `gc.aggressiveWindow` settings below. By
    using a larger window size we're more likely to find more optimal
    deltas.
    
    It's probably not worth it to use this option on a given repository
    without running tailored performance benchmarks on it. It takes a lot
    more time, and the resulting space/delta optimization may or may not
    be worth it. Not using this at all is the right trade-off for most
    users and their repositories.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    -------------
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    include::includes/cmd-config-section-all.txt[]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    include::config/gc.txt[]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    -----
    
    'git gc' tries very hard not to delete objects that are referenced
    
    anywhere in your repository. In particular, it will keep not only
    objects referenced by your current set of branches and tags, but also
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    objects referenced by the index, remote-tracking branches, reflogs
    (which may reference commits in branches that were later amended or
    rewound), and anything else in the refs/* namespace. Note that a note
    (of the kind created by 'git notes') attached to an object does not
    contribute in keeping the object alive. If you are expecting some
    objects to be deleted and they aren't, check all of those locations
    and decide whether it makes sense in your case to remove those
    references.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    On the other hand, when 'git gc' runs concurrently with another process,
    there is a risk of it deleting an object that the other process is using
    but hasn't created a reference to. This may just cause the other process
    to fail or may corrupt the repository if the other process later adds a
    reference to the deleted object. Git has two features that significantly
    mitigate this problem:
    
    . Any object with modification time newer than the `--prune` date is kept,
      along with everything reachable from it.
    
    . Most operations that add an object to the database update the
      modification time of the object if it is already present so that #1
      applies.
    
    However, these features fall short of a complete solution, so users who
    run commands concurrently have to live with some risk of corruption (which
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    seems to be low in practice).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    HOOKS
    -----
    
    The 'git gc --auto' command will run the 'pre-auto-gc' hook.  See
    linkgit:githooks[5] for more information.
    
    
    SEE ALSO
    --------
    linkgit:git-prune[1]
    linkgit:git-reflog[1]
    linkgit:git-repack[1]
    linkgit:git-rerere[1]
    
    GIT
    ---
    Part of the linkgit:git[1] suite