Bug report: git branch behaves as if --no-replace-objects is passed
- From
Elijah Newren <newren@gmail.com>
- Date
- Mar 30, 2021, 06:05 UTC
- Message-ID
- <CABPp-BEAbN05+hCtK=xhGg5uZFqbUvH9hMcCNMcBWp5JWLqzPw@mail.gmail.com>
Hi,
Forwarding a report from https://github.com/newren/git-filter-repo/issues/229, with a few more details...
log, diff, etc. seem to all support replace objects nicely:
git init -b main whatever
cd whatever/
>empty
git add empty
git commit -m initial
git replace -f deadbeefdeadbeefdeadbeefdeadbeefdeadbeef $(git
rev-parse main)echo stuff >>empty
Now, If I try to use this replace object:
$ git diff --stat deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
empty | 1 +
1 file changed, 1 insertion(+)
$ git log --oneline deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
deadbee (replaced) initialit all works well. BUT, if I try to use it with branch it doesn't work:
$ git branch --contains deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
$and possibly worse, if I create a new branch based on it and use it:
$ git branch foobar deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
$ git checkout foobar
$ echo stuff >empty
$ git add empty
$ git commit -m morethen it's clear that branch created foobar pointing to the replaced object rather than the replacement object -- despite the fact that the replaced object doesn't even exist within this repo:
$ git cat-file -p HEAD
tree 18108bae26dc91af2055bc66cc9fea278012dbd3
parent deadbeefdeadbeefdeadbeefdeadbeefdeadbeef
author Elijah Newren <newren@gmail.com> 1617083739 -0700
committer Elijah Newren <newren@gmail.com> 1617083739 -0700more
I poked around in the code a little but it is not at all clear to me why some parts of the code (log, diff) translate replace refs correctly, while others (branch) don't. It is clear from the output that log is aware that the refs are replaced, which makes me wonder if every caller needs to be aware of replace refs for them to work correctly everywhere, because I couldn't find a missing environment setup for "branch".