bug report

This commit is contained in:
Joey Hess 2021-04-13 13:31:51 -04:00
parent 948dd8a0cc
commit a58e955293
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -0,0 +1,41 @@
In unusual circumstances, `git-annex forget` being used in a repo
can confuse updating exporttree remotes.
The export.log contains refs to trees that have been exported. Those trees
get grafted into the git-annex branch to ensure the tree object does not
get garbage collected and is available in clones. But forget rewrites the
branch and those historical versions that include the grafting of the trees
are not included.
Now, this is not normally a problem because the same tree object tends to
get merged into the master branch -- or is the master or other branch that
was exported. And so remains available despite the copy from the git-annex
branch having been garbage collected. But, it is possible for that not to
be the case.
So, the tree object can be garbage collected, and it might be possible for
something involving tree import or export to fail to access it. When that
happens in the same repo that was accessing that exporttree remote,
I'm not sure if that really is a problem, since the export database still
contains the information.
So far, I have only produced the problem by making a clone from the
original repo, and then in the clone the tree object is not accessible,
and it fails like this:
git annex get foo --from dir
get foo (from dir...) fatal: bad object 7cb908c2a9aa7703a39b6c9f10ccb63bf903135b
unknown export location
failed
To cause this problem, I first exported master to dir, the I moved
a file and did a git commit --amend, to change the tree object for master.
Then `git annex forget`. Then I cloned the repo, over ssh (a local
clone still got a copy of the now dangling tree object). After enableremote,
get fails as shown. --[[Joey]]
A solution might be for the branch transition code to preserve old commits
that add/remove export.tree. Or, the branch transition code could examine
the export.log to find the trees that it refers to, and re-graft those back
into the new git-annex branch.