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

Re: [RFC] deprecating and eventually removing "git relink"?

From
Jeff King <peff@peff.net>
Date
Nov 21, 2011, 22:19 UTC
Message-ID
<20111121221934.GA21882@sigill.intra.peff.net>
In-Reply-To
<4ECACC13.7050507@cfl.rr.com>
On Mon, Nov 21, 2011 at 05:09:23PM -0500, Phillip Susi wrote:
Show 14 quoted lines
> I hacked together a setup a few weeks ago that doesn't suffer from
> that problem.  I had two repos that had considerable shared history (
> one forked from the other ), so I created a temporary repository and
> pointed its alternates to the other two.  I then did some shell magic
> to generate a list of all objects shared by both repos, and sent that
> list to git-pack-objects.  This gave me a pack file in the temp repo
> that contained all of the shared objects.  I then made a .keep file
> and hard linked this pack file ( and index, and .keep file ) into
> both original repos, deleted the temp repo, and then repacked both
> original repos. This left them both with two pack files: one that is
> shared, and one that is all of the objects specific to that repo.
> 
> Because the shared objects are in a pack file that both repos hard
> link to, neither one will break if I (re)move the other.

Yes, that is one way to do it. The big drawback there is that by using hard links, you can only share objects between repos within the same filesystem.

I think the presence of the '.keep' files should make "git gc" do the right thing, and not waste space. The relinking procedure is a little more complex, but that's not a big deal. It's just a periodic maintenance thing that will happen inside a script (and you would want to do the periodic maintenance as often as you would with the shared repo approach).

Nothing is maintaining the list of "here are all of the related repos that are sharing objects". Which is a feature in some ways, because you don't have to care if repos go away or move. But when your periodic "git relink" comes around, the burden is on the user to redecide the set of related repos.

So unlike with the shared repo, where "git gc" in a child repo could say "Oh, I have a shared parent; I should go there and do the parent-gc there", relinking would be a more manual thing. On the other hand, nothing is stopping you from building something more automated around this relink-repos-together building block.

So yeah, I think it's a perfectly reasonable approach, if you don't mind the hard link requirement, and your relink is something like "git relink ~/linux-repos/*".

Patches? :)
-Peff
Previous: Phillip SusiNext: Phillip Susi
Message 12 of 15 in “[RFC] deprecating and eventually removing "git relink"?”
  1. Junio C HamanoNov 14, 2011
  2. Miles BaderNov 14, 2011
  3. Junio C HamanoNov 14, 2011
  4. Chris PackhamNov 14, 2011
  5. Simon BrennerNov 14, 2011
  6. Jeff KingNov 14, 2011
  7. Junio C HamanoNov 14, 2011
  8. Jeff KingNov 14, 2011
  9. Junio C HamanoNov 14, 2011
  10. Miles BaderNov 15, 2011
  11. Phillip SusiNov 21, 2011
  12. Jeff KingNov 21, 2011
  13. Phillip SusiNov 22, 2011
  14. Junio C HamanoNov 14, 2011
  15. Miles BaderNov 15, 2011

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.