Hi,
There are two major differences between adding notes with fast-import
and git notes, one of which is a serious problem:
- fast-import doesn't want to add notes for non commits, while git notes
does.
- fast-import and git notes have different, conflicting fanouts:
- take e.g. the git repo (there needs to be a lot of commits to start
to see the problem)
- run the following to create notes for every commit:
(echo 'blob';
echo 'mark :1';
echo 'data 0';
echo 'commit refs/notes/foo';
echo 'committer <foo> 0 +0000';
echo 'data 0';
git rev-list --all | awk '{print "N :1", $1}';
echo) | git fast-import
- pick a random commit. I'll pick
bbcefffcea9789e4a1a2023a1c778e2c07db77a7 as it is current master as
of writing. Take the first two characters of that sha1, and look at
the ls-tree:
git ls-tree refs/notes/foo bb/
You'll see a number of blobs.
- Now, remove the note for that commit with git notes:
git notes --ref foo remove bbcefffcea9789e4a1a2023a1c778e2c07db77a7
- ls-tree again, you'll now see a number of trees instead of blobs,
because git notes will have done a fanout. -> git notes does fanouts
for much less items than fast-import does.
- Re-add a note for that commit with fast-import:
git fast-import <<EOF
blob
mark :1
data 0
commit refs/notes/foo
committer <foo> 0 +0000
data 0
from refs/notes/foo^0
N :1 bbcefffcea9789e4a1a2023a1c778e2c07db77a7
EOF
- ls-tree again, and you'll see a number of trees and *one* blob, for
bb/cefffcea9789e4a1a2023a1c778e2c07db77a7
- See the thread starting with [email protected],
this type of notes branch make things very slow.
- Now, if you take an even bigger repository (as long as there are more
than 65536 commits, that's good ; I guess the linux kernel
qualifies, I've been checking with a mozilla-central clone), and
create exactly 65535 notes with git fast-import, you'll end up with
a 1-level tree (2/38). Add one more note, and the entire tree turns
into a 2-level tree (2/2/36). git notes would only add a level to
the tree containing the added note. git notes's behavior scales
better, because think about what happens on the next fanout with
fast-import... adding one note would need to create millions of trees.
Cheers,
Mike
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html