Re: [QUESTION] about .git/info/grafts file
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:42:17
Franck [off-list ref] writes:
2006/1/20, Junio C Hamano [off-list ref]:quoted
$ git clone git.git junk $ cd junk ;# I am not brave enough to risk the real thing ;-) $ git rev-parse master~4 >.git/refs/info/grafts
Typo: 's|.git/refs/info/grafts|.git/info/grafts|'
BTW the above exact sequence will not work with my "master"
today, since I merged up bunch of things last night. You have
to cauterize all the paths that lead to earlier history. For
example, if I have this:
---o---o---x---o---o---o---o (master)
\ /
o---o---o
cauterizing at master~4 ('x') will still leak history via the
side branch, if you follow the history from the tip and go
backwards. I have to also cauterize the merge commit after that
to remove the side branch, or cauterize the leftmost branch
point and live with a bit deeper history. The choice depends on
how much real history I want to keep in the pruned history.
For example, to pretend the history was like this:
---o---o x---o---o---o---o (master)
\
o---o---o
$ git rev-parse master~4 >.git/info/grafts ;# 'x'
$ git rev-parse master~3 master~4 >.git/info/grafts
The second line says master~3 (the one that comes after 'x') has
only a single parent, which is master~4, in order to throw the
side branch away [*1*].
Back to the original example...
quoted
$ cd .. $ mkdir cloned $ cd cloned $ git init-db $ cp ../junk/.git/info/grafts .git/info/ $ git clone-pack ../baz
There are a couple of typos here and that was the reason your
experiment did not work. Sorry. The "clone-pack" should have
been like this:
$ git clone-pack ../junk master
Packing 471 objects
e7555785f4edcf4988c53305349e3f525216e2cb refs/heads/master
$ git-rev-parse e7555785f >.git/refs/heads/master
This 'cloned' is the lightweight one.
does the git protocol is really needed in your example ? or can rsync work fine too since "franck.git" repo is cautorized so every objects of this repo shouldn't be part of old history, so they should be usefull, no ?
rsync may for the initial clone but its use afterwards is frowned upon for other reasons these days. [Footnote] *1* There still is an anomaly if you look at "git log" after pruning side branch this way; master~3 commit is still shown as "merge". I think you could call it a bug, but I am not sure it is worth fixing.