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

Re: Using ‘git replace’ to replace blobs

From
Christian Couder <chriscool@tuxfamily.org>
Date
Feb 7, 2010, 06:45 UTC
Message-ID
<201002070746.00200.chriscool@tuxfamily.org>
In-Reply-To
<20100207011056.GA15307@progeny.tock>
On dimanche 07 février 2010, Jonathan Nieder wrote:
Show 10 quoted lines
> I think it is a known problem that ‘git replace’ cannot be used safely
> to replace blobs used in the currently checked out commit.  The man
> page says:
>
> 	Comparing blobs or trees that have been replaced with
> 	those that replace them will not work properly.
>
> Indeed, in practice it produces problems. [1]
>
> I would like to start to fix this.  

One way to fix it may be to use a bit in "struct object" that could tell if any object was replaced or not. I think that in the "Add caching support to git-daemon" GSoc patches, Nick Edelen did something like that for grafts. (See http://thread.gmane.org/gmane.comp.version-control.git/127932/)

Show 5 quoted lines
> But the correct semantics are not 
> obvious to me:
>
>  - When writing a tree from an index that includes replaced blobs,
>    should the result use the original blobs or the replaced ones?

It may depend on why the original blob was replaced in the first place. I did not think much about this though.

>  - When reading a tree that includes replaced blobs, should the
>    resulting cache entries use the original blobs or the replaced
>    ones?

I think it should depend on whether the global variable read_replace_refs is set or not.

> My hunch is to say both should use the replaced blobs.  This way,
> replacing a blob in a checked-out index would behave in a more
> intuitive way, and git filter-branch would make permanent any
> substitutions requested through replaced blob entries.

It might not always be a good idea to make any substitution permanent. For example if you use git replace to improve the bisectability of your commit history you may want to keep the original commits.

I know you are talking about blobs, not commits, but perhaps there are some similar use cases of replaced blobs.

Thanks for looking at that, Christian.

Previous: Jonathan Nieder
Message 2 of 2 in “Using ‘git replace’ to replace blobs”
  1. Jonathan NiederFeb 7, 2010
  2. Christian CouderFeb 7, 2010

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.