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

Re: Bugs in git filter-branch (git replace related)

From
Anatoly Borodin <anatoly.borodin@gmail.com>
Date
Jan 29, 2016, 18:24 UTC
Message-ID
<n8gao5$3c6$1@ger.gmane.org>
In-Reply-To
<20160129061820.GB23106@sigill.intra.peff.net>
Hi Jeff,

I've created a gist with the script https://gist.github.com/anatolyborodin/6505a364a68584f13846

I've added some changes and a second test (will be discussed in the comments).

Jeff King <peff@peff.net> wrote:
Show 7 quoted lines
> I'm not sure if this is a bug or not. The "empty commit" check works by
> checking the tree sha1s, without doing a full diff respecting replace
> refs.
> 
> You're expecting git to notice a tree change, even though it never even
> examined the tree in the first place (because you didn't give it a tree
> or index filter).

When git-filter-branch(1) says "If you have any grafts or replacement refs defined, running this command will make them permanent.", and it doesn't work like that because of some optimization, it *is* a bug.

Show 6 quoted lines
> Try:
> 
>   git filter-branch --prune-empty --tree-filter true master
> 
> which will force git to go through the motions of checking out the
> replaced content and re-examining it.

Thank you, I've added this command to the script, and it works! I think it should be added to git-filter-branch(1), if there is no other way to rewrite the optimization.

Show 7 quoted lines
>> Bug 2: the replace refs are not ignored (they can epresent blobs, trees etc,
>> but even if they represent commits - should they be rewritten?).
> 
> You told it "--all", which is passed to rev-list, where it means "all
> refs". I agree that running filter-branch on refs/replace is probably
> not going to yield useful results, but I'm not sure if it is
> filter-branch's responsibility to second-guess the rev-list options.

Look how `git log --all` works (see the second test in the script): it ignores (without any messages) the blobs, and writes only the commits. For example, the same commit log message is printed twice in the second testcase.

Maybe it makes sence, I don't know. I would suggest that all refs/replace/* heads should be ignored by `git log`. `git rev-list --no-replace` maybe?

> Probably the documentation for filter-branch should recommend
> "--branches --tags" instead of "--all", though.

Or redefine `--all` as "all refs excepting refs/replace/*". Who would really want to run `--all` the way it works now?

The blobs replaces should be ignored, as in `git log --all`. Is there any reason to rewrite refs/rebase/hash if it's a replace commit?

-- 
Mit freundlichen Grüßen,
Anatoly Borodin
Previous: Jeff KingNext: Jeff King
Message 3 of 6 in “Bugs in git filter-branch (git replace related)”
  1. Anatoly BorodinJan 28, 2016
  2. Jeff KingJan 29, 2016
  3. Anatoly BorodinJan 29, 2016
  4. Jeff KingJan 29, 2016
  5. A different bug in git-filter-branch (v2.7.0)Anatoly Borodin, Feb 8, 2016
  6. Jeff KingFeb 22, 2016

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.