git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [QUESTION] about .git/info/grafts file

From
Junio C Hamano <junkio@cox.net>
Date
Jan 19, 2006, 00:40 UTC
Message-ID
<7v8xtdrqwg.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<cda58cb80601170932o6f955469y@mail.gmail.com>
Franck <vagabon.xyz@gmail.com> writes:
> I'm wondering why the "grafts" files is not involved during
> push/pull/clone operations ?

Commit ancestry grafting is a local repository issue and even if you manage to lie to your local git that 300,000th commit is the epoch, the commit object you send out to the downloader would record its true parent (or parents, if it is a merge), so the downloader would want to go further back. And no, rewriting that commit and feeding a parentless commit to the downloader is not an option, because such a commit object would have different object name and unpack-objects would be unhappy.

If you choose not to have full history in your public repository for whatever reason (ISP server diskquota comes to mind) that is OK, but be honest about it to your downloaders. Tell them that you do not have the full history, and they first need to clone from some other repository you started your development upon, in order to use what you added upon. "This repository does not have all the history -- please first clone from XX repository (you need at least xxx commit), and then do another 'git pull' from here", or something like that.

It _might_ work if you tell your downloader to have a proper graft file in his repository to cauterize the commit ancestry chain _before_ he pulls from you, though. I haven't tried it (and honestly I did not feel that is something important to support, so it might work by accident but that is not by design).

>                $ git-merge-base master origin
>                # nothing

Maybe you did not use grafts properly to cauterize? I tried the following and am getting expected results. I did not have patience to do 300,000, so I cut things at #4, though.

-- 8< -- 
#!/bin/sh

rm -fr .git git init-db echo 0 >path git add path

for i in 1 2 3 4 5 6 7
do
	echo $i >path
	git commit -a -m "Iteration #$i"
	git tag "iter#$i"
done
git checkout -b mine iter#4
for i in A B C D
do
	echo $i >path
	git commit -a -m "Alternate #$i"
	git tag "alt#$i"
done

git log --pretty=oneline --topo-order echo merge base is `git merge-base master mine` | git name-rev --stdin

git-rev-parse iter#4 >.git/info/grafts echo "Cauterize away history before #4"

git log --pretty=oneline --topo-order echo merge base is `git merge-base master mine` | git name-rev --stdin

Previous: FranckNext: Franck
Message 3 of 21 in “[QUESTION] about .git/info/grafts file”
  1. FranckJan 17, 2006
  2. FranckJan 18, 2006
  3. Junio C HamanoJan 19, 2006
  4. FranckJan 19, 2006
  5. Petr BaudisJan 19, 2006
  6. Linus TorvaldsJan 19, 2006
  7. FranckJan 19, 2006
  8. Linus TorvaldsJan 19, 2006
  9. Junio C HamanoJan 19, 2006
  10. Junio C HamanoJan 19, 2006
  11. FranckJan 20, 2006
  12. Andreas EricssonJan 19, 2006
  13. Petr BaudisJan 19, 2006
  14. FranckJan 19, 2006
  15. Andreas EricssonJan 19, 2006
  16. Petr BaudisJan 19, 2006
  17. Petr BaudisJan 19, 2006
  18. Ryan AndersonJan 20, 2006
  19. Junio C HamanoJan 20, 2006
  20. FranckJan 20, 2006
  21. Junio C HamanoJan 20, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.