diff --git a/doc/bugs/git_annex_forget_can_confuse_updating_exporttree_remotes.mdwn b/doc/bugs/git_annex_forget_can_confuse_updating_exporttree_remotes.mdwn new file mode 100644 index 0000000000..280faf9636 --- /dev/null +++ b/doc/bugs/git_annex_forget_can_confuse_updating_exporttree_remotes.mdwn @@ -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.