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

Re: git am from scratch

From
Jeff King <peff@peff.net>
Date
Mar 19, 2009, 21:02 UTC
Message-ID
<20090319210214.GA17589@coredump.intra.peff.net>
In-Reply-To
<200903192142.49754.agruen@suse.de>
On Thu, Mar 19, 2009 at 09:42:49PM +0100, Andreas Gruenbacher wrote:
> > I don't think this has ever worked in any version of git.
> I did find a way to help myself in the end. Still it was still a major, 
> unnecessary annoyance.

Sure, and that is why I suggested a patch for git-am might be welcome; it's not the right tool for the job, but it seems to be one that people naturally think of.

Show 5 quoted lines
> I ran into this problem when trying to reconstruct a project's history (after 
> going RCS -> CVS -> git many things were still wrong like unrelated RCS files 
> which ended up in the history, RCS files being moved to the Attic in the 
> original tree to indicate deletes [which means they will happily live on from 
> a CVS point of view], etc.).
Yikes. Out of curiosity, what did you use to do the CVS import?

Anyway, here is a not-very-well-tested patch to get "git am" to apply on top of an empty repository (i.e., it worked on my utterly simplistic test case and I didn't think too hard about what else might have been broken). Maybe it will give a good start to somebody who wants to work on this.

---
diff --git a/git-am.sh b/git-am.sh
index d339075..bcc600d 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -290,17 +290,23 @@ else
 		: >"$dotest/rebasing"
 	else
 		: >"$dotest/applying"
-		git update-ref ORIG_HEAD HEAD
+		if git rev-parse --quiet --verify HEAD; then
+			git update-ref ORIG_HEAD HEAD
+		else
+			rm -f "$GIT_DIR/ORIG_HEAD"
+		fi
 	fi
 fi
 
 case "$resolved" in
 '')
-	files=$(git diff-index --cached --name-only HEAD --) || exit
-	if test "$files"
-	then
-		: >"$dotest/dirtyindex"
-		die "Dirty index: cannot apply patches (dirty: $files)"
+	if git rev-parse --quiet --verify HEAD; then
+		files=$(git diff-index --cached --name-only HEAD --) || exit
+		if test "$files"
+		then
+			: >"$dotest/dirtyindex"
+			die "Dirty index: cannot apply patches (dirty: $files)"
+		fi
 	fi
 esac
 
@@ -541,7 +547,7 @@ do
 	fi
 
 	tree=$(git write-tree) &&
-	parent=$(git rev-parse --verify HEAD) &&
+	parent=$(git rev-parse --quiet --verify HEAD)
 	commit=$(
 		if test -n "$ignore_date"
 		then
@@ -552,7 +558,7 @@ do
 			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
 			export GIT_COMMITTER_DATE
 		fi &&
-		git commit-tree $tree -p $parent <"$dotest/final-commit"
+		git commit-tree $tree ${parent:+-p $parent} <"$dotest/final-commit"
 	) &&
 	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
 	stop_here $this
Previous: Andreas GruenbacherNext: Junio C Hamano
Message 5 of 8 in “git am from scratch”
  1. Andreas GruenbacherMar 19, 2009
  2. Eric RaibleMar 19, 2009
  3. Jeff KingMar 19, 2009
  4. Andreas GruenbacherMar 19, 2009
  5. Jeff KingMar 19, 2009
  6. Junio C HamanoMar 19, 2009
  7. Andreas GruenbacherMar 20, 2009
  8. Jeff KingMar 20, 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.