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

Re: how to force a commit date matching info from a mbox ?

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 23, 2009, 09:39 UTC
Message-ID
<7vtz7qxsxc.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<20090123172646.6117@nanako3.lavabit.com>
Nanako Shiraishi <nanako3@lavabit.com> writes:
Show 5 quoted lines
> Quoting Junio C Hamano <gitster@pobox.com>:
>
>> Correct.  I did not run that new test, let alone existing ones ;-)
>
> I applied your patch and run the test suite, including the new one, and they passed.
Thanks.
> I tried to write a new option I said that I wanted in my previous message.  Here is a patch.
>
> --->8---
> Subject: [PATCH] git-am: Add --ignore-date option
Good.

Leaving "Subject: " in saves me typing, because I do not have to insert it manually when editing the submitted patch in my MUA to chop off everything before the scissors.

Show 10 quoted lines
> This new option makes the command ignore the date header field recorded in
> the format-patch output.  The commits will have the timestamp when they
> are created instead.
>
> You can work a lot in one day to accumulate many changes, but apply and
> push to the public repository only some of them at the end of the first
> day.  Then next day you can spend all your working hours reading comics or
> chatting with your coworkers, and apply your remaining patches from the
> previous day using this option to pretend that you have been working at
> the end of the day.
LOL.  A slacker option is a tough sell to a serious management, though.

I think it would work equally well if you somehow manage to pass this through "git-rebase", but this won't work with "git-rebase --interactive".

Show 12 quoted lines
> @@ -379,7 +383,13 @@ do
>  
>  	GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
>  	GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
> -	GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
> +	case "$ignore_date" in
> +	    t)
> +		GIT_AUTHOR_DATE="$(date -R)"
> +		;;
> +	    '')
> +		GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
> +	esac

Please align case arm labels with case/esac; iow, do not indent t) and '') by four spaces, when you write your next case/esac statement.

"date -R" is a GNU extension; avoid it (I'll show you how at the end).
Show 16 quoted lines
> diff --git a/t/t4150-am.sh b/t/t4150-am.sh
> index 8d3fb00..5ecf456 100755
> --- a/t/t4150-am.sh
> +++ b/t/t4150-am.sh
> @@ -277,4 +277,13 @@ test_expect_success 'am without --committer-date-is-author-date' '
>  	test "$at" != "$ct"
>  '
>  
> +test_expect_success 'am --ignore-date' '
> +	git checkout first &&
> +	test_tick &&
> +	git am --ignore-date patch1 &&
> +	git cat-file commit HEAD | sed -e "/^$/q" >head1 &&
> +	at=$(sed -ne "/^author /s/.*> //p" head1) &&
> +	echo "$at" | grep "+0000"
> +'
This is a convoluted logic.

The committer and author dates are set to -0700 timezone by test_tick, while TZ is set to UTC (+0000) by test-lib.sh, and you are taking advantage of them to see which one is being used.

But I do not think of a better way to do this offhand, so I'll let it pass.

Regarding the "date -R" thing, I think we can take advantage of the fact that an empty GIT_AUTHOR_DATE (and GIT_COMMITTER_DATE) means "do not use this environment variable, but use the current date instead". Something like this patch on top of yours, whose first hunk reverts your change to use "date -R", and sets GIT_AUTHOR_DATE to empty when --ignore-date is asked for.

No, I didn't test it.
diff --git i/git-am.sh w/git-am.sh
index eb88d90..f935178 100755
--- i/git-am.sh
+++ w/git-am.sh
@@ -383,13 +383,7 @@ do
 
 	GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
 	GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
-	case "$ignore_date" in
-	    t)
-		GIT_AUTHOR_DATE="$(date -R)"
-		;;
-	    '')
-		GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
-	esac
+	GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
 
 	if test -z "$GIT_AUTHOR_EMAIL"
 	then
@@ -536,6 +530,10 @@ do
 	tree=$(git write-tree) &&
 	parent=$(git rev-parse --verify HEAD) &&
 	commit=$(
+		if test -n "$ignore_date"
+		then
+			GIT_AUTHOR_DATE=
+		fi
 		if test -n "$committer_date_is_author_date"
 		then
 			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
Previous: Nanako ShiraishiNext: Jeff King
Message 6 of 19 in “how to force a commit date matching info from a mbox ?”
  1. Christian MICHONJan 22, 2009
  2. Junio C HamanoJan 23, 2009
  3. Nanako ShiraishiJan 23, 2009
  4. Junio C HamanoJan 23, 2009
  5. Nanako ShiraishiJan 23, 2009
  6. Junio C HamanoJan 23, 2009
  7. Jeff KingJan 23, 2009
  8. Johannes SchindelinJan 24, 2009
  9. Jeff KingJan 24, 2009
  10. Johannes SchindelinJan 24, 2009
  11. Jeff KingJan 24, 2009
  12. Nanako ShiraishiJan 23, 2009
  13. Junio C HamanoJan 23, 2009
  14. Johannes SchindelinJan 23, 2009
  15. Adeodato SimóJan 23, 2009
  16. Christian MICHONJan 23, 2009
  17. Christian MICHONJan 23, 2009
  18. Johannes SchindelinJan 23, 2009
  19. Christian MICHONJan 23, 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.