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

[RFC/PATCH] Add a new commit-raw command.

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Feb 24, 2009, 21:28 UTC
Message-ID
<1235510914-23319-1-git-send-email-felipe.contreras@gmail.com>

This command receives as input a raw commit object, and outputs the generated sha1. This is very useful when doing some serious repo reconstructions.

For example: git cat-file -p 343ee25 | git write-raw 343ee2589d1b94772f513cc699765622351acb19

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 Makefile             |    1 +
 builtin-commit-raw.c |   23 +++++++++++++++++++++++
 builtin.h            |    1 +
 git.c                |    1 +
 4 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 builtin-commit-raw.c
diff --git a/Makefile b/Makefile
index b040a96..94212b3 100644
--- a/Makefile
+++ b/Makefile
@@ -524,6 +524,7 @@ BUILTIN_OBJS += builtin-checkout-index.o
 BUILTIN_OBJS += builtin-checkout.o
 BUILTIN_OBJS += builtin-clean.o
 BUILTIN_OBJS += builtin-clone.o
+BUILTIN_OBJS += builtin-commit-raw.o
 BUILTIN_OBJS += builtin-commit-tree.o
 BUILTIN_OBJS += builtin-commit.o
 BUILTIN_OBJS += builtin-config.o
diff --git a/builtin-commit-raw.c b/builtin-commit-raw.c
new file mode 100644
index 0000000..66c41f4
--- /dev/null
+++ b/builtin-commit-raw.c
@@ -0,0 +1,23 @@
+/*
+ * Writes a raw commit object
+ */
+
+#include "cache.h"
+#include "commit.h"
+
+int cmd_commit_raw(int argc, const char **argv, const char *unused_prefix)
+{
+	unsigned char commit_sha1[20];
+	struct strbuf buffer;
+
+	strbuf_init(&buffer, 8192);
+
+	strbuf_read(&buffer, 0, 0);
+
+	if (!write_sha1_file(buffer.buf, buffer.len, "commit", commit_sha1)) {
+		printf("%s\n", sha1_to_hex(commit_sha1));
+		return 0;
+	}
+	else
+		return 1;
+}
diff --git a/builtin.h b/builtin.h
index 1495cf6..5c33e69 100644
--- a/builtin.h
+++ b/builtin.h
@@ -38,6 +38,7 @@ extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix);
 extern int cmd_clone(int argc, const char **argv, const char *prefix);
 extern int cmd_clean(int argc, const char **argv, const char *prefix);
 extern int cmd_commit(int argc, const char **argv, const char *prefix);
+extern int cmd_commit_raw(int argc, const char **argv, const char *prefix);
 extern int cmd_commit_tree(int argc, const char **argv, const char *prefix);
 extern int cmd_count_objects(int argc, const char **argv, const char *prefix);
 extern int cmd_describe(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index c2b181e..b033365 100644
--- a/git.c
+++ b/git.c
@@ -285,6 +285,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "clone", cmd_clone },
 		{ "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
 		{ "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
+		{ "commit-raw", cmd_commit_raw, RUN_SETUP },
 		{ "commit-tree", cmd_commit_tree, RUN_SETUP },
 		{ "config", cmd_config },
 		{ "count-objects", cmd_count_objects, RUN_SETUP },
-- 
1.6.1.3
Next: Jeff King
Message 1 of 4 in “Add a new commit-raw command.”
  1. Add a new commit-raw command.Felipe Contreras, Feb 24, 2009
  2. Jeff KingFeb 24, 2009
  3. Felipe ContrerasFeb 24, 2009
  4. Shawn O. PearceFeb 24, 2009

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.