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

Re: [PATCH 2/3] commit: add function to unparse a commit and its parents

From
Junio C Hamano <gitster@pobox.com>
Date
May 19, 2009, 07:14 UTC
Message-ID
<7vfxf18szq.fsf@alter.siamese.dyndns.org>
In-Reply-To
<m3r5ylk347.fsf@localhost.localdomain>
Jakub Narebski <jnareb@gmail.com> writes:
> First, I have always thought that you cannot push arbitrary SHA-1
> (arbitrary commits) in git; you can only push via refs. Isn't it true?
No.
> Second, the "refs/replace" mechanism has the advantage over grafts
> that it is sanely transferrable. Whether "04a8c^2"^{replaced} exists
> on remote side depends on if other side has the same replacement, or
> if you push replacements in the same push.

The reason why replace mechanism could be cleaner than grafts is because reachability traversal and transfer do not obey replacements, and local ancestry traversal will if there are refs/replace entries.

So "git log" and friends will obey refs/replace/*, but between a repository that replaces a commit and another that doesn't, they will transfer history without replace entries getting in the way. Whatever 04a8c^2 resolves to with replacements, the _real_ history between that commit and whatever the tips of refs on the other side has is transferred, and that commit will update the 'master' branch on the other side.

If the other side sees it as the second parent of 04a8c is a different matter. If refs/replace hierarchy is shared between the repositories, it will; otherwise it won't. And the beauty of the replace mechanism is, unlike grafts, because object transfer will always be done using _real_ history, you can sanely sync refs/replace hierarchy between the repositories via push or fetch. During the push of the 04a8c^2 object, the other side does not have to worry about the presense/absense of replace that changes the interpretation of that notation on either end. The exact same underlying history is transferred with or without the replacement objects.

Previous: Miles BaderNext: Jakub Narebski
Message 8 of 13 in “bisect: rework some rev related functions to make them more reusable”
  1. 1/3 bisect: rework some rev related functions to make them more reusableChristian Couder, May 17, 2009
  2. 2/3 commit: add function to unparse a commit and its parentsChristian Couder, May 17, 2009
  3. Junio C HamanoMay 18, 2009
  4. Christian CouderMay 19, 2009
  5. Junio C HamanoMay 19, 2009
  6. Jakub NarebskiMay 19, 2009
  7. Miles BaderMay 19, 2009
  8. Junio C HamanoMay 19, 2009
  9. Jakub NarebskiMay 19, 2009
  10. Johannes SixtMay 25, 2009
  11. Johannes SchindelinMay 25, 2009
  12. Christian CouderMay 27, 2009
  13. 3/3 bisect: check ancestors without forking a "git rev-list" processChristian Couder, May 17, 2009

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.