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

Re: History rewriting swiss army knife

From
Petr Baudis <pasky@suse.cz>
Date
Mar 26, 2006, 13:17 UTC
Message-ID
<20060326131743.GK18185@pasky.or.cz>
In-Reply-To
<7vek0rzchc.fsf@assigned-by-dhcp.cox.net>

Dear diary, on Fri, Mar 24, 2006 at 11:47:43PM CET, I got a letter where Junio C Hamano <junkio@cox.net> said that...

Show 16 quoted lines
> Petr Baudis <pasky@suse.cz> writes:
> 
> >   It's never been so easy before - I've written cg-admin-rewritehist,
> > which will execute your filters for each commit (which can rewrite the
> > tree contents, just the tree itself through the index, committer/author
> > information and commit message) while the script will obviously preserve
> > all the other information like merges, author/committer information etc.
> 
> Hmph.  The above description sounds like you are not allowing
> the user's custom script to drop existing parent (or graft a new
> one) while rewriting.  I have not looked at how you are
> interfacing with user's custom script, but I sort-of expected
> you to throw a commit at it from older to newer (i.e. topo-order
> in reverse), along with the names of already re-written commit
> objects that are parents of taht commit, and have it build a
> rewritten commit and report its object name back to you.

There are rather several "filters" (user scripts) which are called at various stages of the commit rewrite. In sum they are doing the same thing as the single user script would, but cg-admin-rewritehist will prepare some things to you so that everyone does not have to write the common stuff again and again.

The net flexibility loss was zero, except two things:
* The parents list construction was hardcoded. Now I added a parent
  filter which gets the parent string on stdin (including the -p bits,
  but life's tough) and let it rewrite it (e.g. add stuff at the end).
  So to "etch a graft":
	cg-admin-rewritehist --parent-filter sed\ 's/^$/-p graftcommitid/' newbranch
  assuming single-root history; but you have current commit id in
  $GIT_COMMIT so you can go wild:
	cg-admin-rewritehist --parent-filter 'cat; [ "$GIT_COMMIT" = "COMMIT" ] && echo "-p GRAFTCOMMIT"' newbranch
* A new commit would be always created. Sometimes you might want to
  omit some commits. Now I added a commit filter which would be
  called instead of the git-commit-tree command.
  To remove commits authored by "Darl McBribe" from the history:
	cg-admin-rewritehist --commit-filter '
		if [ "$GIT_AUTHOR_NAME" = "Darl McBribe" ]; then
			shift
			while [ -n "$1" ]; do
				shift; echo "$1"; shift
			done
		else
			git-commit-tree "$@"
		fi' newbranch
  (note that this will handle even Darl's merges).
Thanks for the inspiration,
-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Right now I am having amnesia and deja-vu at the same time.  I think
I have forgotten this before.
Previous: Junio C Hamano
Message 3 of 3 in “History rewriting swiss army knife”
  1. Petr BaudisMar 24, 2006
  2. Junio C HamanoMar 24, 2006
  3. Petr BaudisMar 26, 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.