git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Create 'git gc' to perform common maintenance operations.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Dec 27, 2006, 07:05 UTC
Message-ID
<20061227070541.GA22982@spearce.org>

Junio asked for a 'git gc' utility which users can execute on a regular basis to perform basic repository actions such as:

 * prune
 * repack -a -d
 * reflog expire
 * rerere gc
 * pack-refs --prune

So here is a command which does exactly that. The parameters fed to reflog's expire subcommand can be chosen by the user by setting configuration options in .git/config (or ~/.gitconfig), as users may want different expiration windows for each repository but shouldn't be bothered to remember what they are all of the time.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .gitignore               |    1 +
 Documentation/git-gc.txt |   55 ++++++++++++++++++++++++++++++++++++++++++++++
 Makefile                 |    2 +-
 git-gc.sh                |   30 +++++++++++++++++++++++++
 4 files changed, 87 insertions(+), 1 deletions(-)
diff --git a/.gitignore b/.gitignore
index 91e6966..f92e359 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,6 +41,7 @@ git-fmt-merge-msg
 git-for-each-ref
 git-format-patch
 git-fsck-objects
+git-gc
 git-get-tar-commit-id
 git-grep
 git-hash-object
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
new file mode 100644
index 0000000..a494b1f
--- /dev/null
+++ b/Documentation/git-gc.txt
@@ -0,0 +1,55 @@
+git-gc(1)
+===========
+
+NAME
+----
+git-gc - Cleanup unnecessary files and optimize the local repository.
+
+
+SYNOPSIS
+--------
+'git-gc'
+
+DESCRIPTION
+-----------
+Runs a number of housekeeping tasks within the current repository,
+such as compressing file revisions (to reduce disk space and increase
+performance) and removing unreachable objects which may have been
+created from prior invocations of gitlink:git-add[1].
+
+Users are encouraged to run this task on a regular basis within
+each repository to maintain good disk space utilization and good
+operating performance.
+
+Configuration
+-------------
+
+The optional configuration variable 'gc.reflogExpire' can be
+set to indicate how long historical entries within each branch's
+reflog should remain available in this repository.  The setting is
+expressed as a length of time, for example '90 days' or '3 months'.
+It defaults to '90 days'.
+
+The optional configuration variable 'gc.reflogExpireUnreachable'
+can be set to indicate how long historical reflog entries which
+are not part of the current branch should remain available in
+this repository.  These types of entries are generally created as
+a result of using `git commit \--amend` or `git rebase` and are the
+commits prior to the amend or rebase occuring.  Since these changes
+are not part of the current project most users will want to expire
+them sooner.  This option defaults to '60 days'.
+
+See Also
+--------
+gitlink:git-prune[1]
+gitlink:git-repack[1]
+gitlink:git-rerere[1]
+
+Author
+------
+Written by Shawn O. Pearce <spearce@spearce.org>
+
+GIT
+---
+Part of the gitlink:git[7] suite
+
diff --git a/Makefile b/Makefile
index b8b746f..fb6ba27 100644
--- a/Makefile
+++ b/Makefile
@@ -157,7 +157,7 @@ BASIC_LDFLAGS =
 SCRIPT_SH = \
 	git-bisect.sh git-checkout.sh \
 	git-clean.sh git-clone.sh git-commit.sh \
-	git-fetch.sh \
+	git-fetch.sh git-gc.sh \
 	git-ls-remote.sh \
 	git-merge-one-file.sh git-parse-remote.sh \
 	git-pull.sh git-rebase.sh \
diff --git a/git-gc.sh b/git-gc.sh
new file mode 100644
index 0000000..cb70412
--- /dev/null
+++ b/git-gc.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, Shawn O. Pearce
+#
+# Cleanup unreachable files and optimize the repository.
+
+USAGE=''
+SUBDIRECTORY_OK=Yes
+. git-sh-setup
+
+reflog_expire=$(git-repo-config gc.reflogExpire)
+if [ -z "$reflog_expire" ]
+then
+	reflog_expire="90 days"
+fi
+
+reflog_unreachable=$(git-repo-config gc.reflogExpireUnreachable)
+if [ -z "$reflog_unreachable" ]
+then
+	reflog_unreachable="60 days"
+fi
+
+git-pack-refs --prune &&
+git-reflog expire \
+	--expire="$reflog_expire" \
+	--expire-unreachable="$reflog_unreachable" \
+	--all &&
+git-prune &&
+git-repack -a -d &&
+git-rerere gc || exit
-- 
1.4.4.3.gd2e4
Next: Linus Torvalds
Message 1 of 2 in “Create 'git gc' to perform common maintenance operations.”
  1. Create 'git gc' to perform common maintenance operations.Shawn O. Pearce, Dec 27, 2006
  2. Linus TorvaldsDec 27, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.