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

Re: Fetching everything in another bare repo

From
Paul Smith <paul@mad-scientist.net>
Date
Mar 9, 2023, 13:55 UTC
Message-ID
<64282d0f99df59085a18585846d2086a652677e2.camel@mad-scientist.net>
In-Reply-To
<ZAl/lQMhaQ54BDXN@coredump.intra.peff.net>
On Thu, 2023-03-09 at 01:41 -0500, Jeff King wrote:
Show 10 quoted lines
> On Wed, Mar 08, 2023 at 05:39:07PM -0500, Paul Smith wrote:
> 
> > I have a tool that wants to preserve every commit and never garbage
> > collect (there are references that need to be maintained to older
> > commits/branches that have been deleted).  This tool keeps its own
> > bare clone, and disables all GC and maintenance on it.
> 
> OK. It's not clear to me if this archive repo retains the old
> references, or if it simply has a bunch of unreachable objects.
> That distinction will matter below.

Sorry; I've been using Git for a long time but am still not totally immersed in the terminology :).

Basically, these bare clones have "gc.pruneExpire=never" set, and have never had any GC operations run so all commits are still present (when you say "unreachable" I assume you mean, not reachable through any reference).

There is a separate database of information containing SHAs for these commits, that is used to find them, but there is nothing in Git itself that references them so they are indeed unreachable as far as Git is concerned.

Show 6 quoted lines
> I think you probably want to treat the objects and references
> separately. It's safe to just copy all of the objects and packfiles
> from the old clone into the new one. You'll have duplicates, but you
> should be able to de-dup and get a single packfile with:
> 
>   git repack -ad --keep-unreachable

Oh interesting. I did a quick verification and all of the objects / packfiles in the old clone either don't exist in the new one, or are identical. I'm sure you expected that but I needed to reassure myself I wouldn't be overwriting anything :).

One question: is the objects/info/packs file anything to be concerned about or will git repack (or something) take care of handling it?

> And then you can do any ref updates in the new repository (since it
> now has all objects from both).

It's actually possible that I don't care about refs at all. I might only care about objects. I'm not sure, I can check what exists in the old clone.

But if I need them I can deal with them as you suggest (or something similar).

Thanks Jeff!
Previous: Jeff KingNext: Jeff King
Message 3 of 7 in “Fetching everything in another bare repo”
  1. Paul SmithMar 8, 2023
  2. Jeff KingMar 9, 2023
  3. Paul SmithMar 9, 2023
  4. Jeff KingMar 9, 2023
  5. Konstantin RyabitsevMar 9, 2023
  6. Jeff KingMar 10, 2023
  7. Paul SmithMar 9, 2023

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.