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

[PATCH] Make git prune remove temporary packs that look like write failures

From
DTDavid Steven Tweed <d.s.tweed@reading.ac.uk>
Date
Feb 5, 2008, 18:49 UTC
Message-ID
<Pine.GSO.4.63.0802051844220.15867@suma3>

Write errors when repacking (eg, due to out-of-space conditions) can leave temporary packs (and possibly other files beginning with "tmp_") lying around which no existing codepath removes and which aren't obvious to the casual user. These can also be multi-megabyte files wasting noticeable space. Unfortunately there's no way to definitely tell in builtin-prune that a tmp_ file is not being used by a concurrent process. However, it is documented that pruning should only be done on a quiet repository. The names of removed files are printed.

Signed-off-by: David Tweed (david.tweed@gmail.com)
---

Per discussion of previous version, this now unconditionally removes any tmp_ file existing when prune is run.

  builtin-prune.c |   25 +++++++++++++++++++++++++
  1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/builtin-prune.c b/builtin-prune.c
index b5e7684..9db3cf0 100644
--- a/builtin-prune.c
+++ b/builtin-prune.c
@@ -83,6 +83,30 @@ static void prune_object_dir(const char *path)
  	}
  }

+/*
+ * Write errors (particularly out of space) can result in
+ * failed temporary packs (and more rarely indexes and other
+ * files begining with "tmp_") accumulating in the
+ * object directory.
+ */
+static void remove_temporary_files(void)
+{
+	DIR *dir;
+	struct dirent *de;
+	char* dirname=get_object_directory();
+
+	dir = opendir(dirname);
+	while ((de = readdir(dir)) != NULL) {
+		if (strncmp(de->d_name, "tmp_", 4) == 0) {
+			char name[4096];
+			sprintf(name, "%s/%s", dirname, de->d_name);
+			printf("Removing abandoned pack %s\n", name);
+			unlink(name);
+		}
+	}
+	closedir(dir);
+}
+
  int cmd_prune(int argc, const char **argv, const char *prefix)
  {
  	int i;
@@ -115,5 +139,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)

  	sync();
  	prune_packed_objects(show_only);
+	remove_temporary_files();
  	return 0;
  }
-- 
1.5.4.19.g40d1a-dirty
Next: Nicolas Pitre
Message 1 of 20 in “Make git prune remove temporary packs that look like write failures”
  1. Make git prune remove temporary packs that look like write failuresDavid Steven Tweed, Feb 5, 2008
  2. Nicolas PitreFeb 5, 2008
  3. prune: heed --expire for stale packs, add a testJohannes Schindelin, Feb 5, 2008
  4. Nicolas PitreFeb 5, 2008
  5. Junio C HamanoFeb 6, 2008
  6. Johannes SchindelinFeb 6, 2008
  7. Nicolas PitreFeb 6, 2008
  8. Junio C HamanoFeb 6, 2008
  9. Brandon CaseyFeb 6, 2008
  10. David TweedFeb 6, 2008
  11. Brandon CaseyFeb 6, 2008
  12. David TweedFeb 6, 2008
  13. Nicolas PitreFeb 6, 2008
  14. Brandon CaseyFeb 6, 2008
  15. David TweedFeb 6, 2008
  16. Nicolas PitreFeb 6, 2008
  17. David TweedFeb 6, 2008
  18. Nicolas PitreFeb 6, 2008
  19. David TweedFeb 6, 2008
  20. Junio C HamanoFeb 6, 2008

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.