threads / discuss / 59366

Track git blame through two unrelated histories

Subject: Track git blame through two unrelated histories

## tl;dr

4 messages between Mar 9, 2023 and Mar 13, 2023.

replies: 3people: 2as markdown or json

Ilia Pozhilov· Mar 9, 2023, 11:05 UTC · lore
Hello!

I have a weird use case. A repository at my company was migrated git -> non-git vcs -> git again.

During transition to non-git vcs the history was lost, i.e. an initial commit was created from some known commit from the old git repo.

Migration to new git repo was more transparent and we have the whole history.

So let's say I add two remotes and fetch all the commits, but they look like this:

A->B-> .... . . . -> Z    history1
1 -> 2 -> ..... -> 0 history2

and file contents in commits Z and 1 are exactly the same, but the commits themselves are completely unrelated for git.

What I want to achieve is blame working across this boundary.

What can I do? It this possible right now? Is it difficult to implement? Is there a good enough workaround? I don't think rewriting commits 1... 0 is an option, but rewriting A ... Z is an option.

What do you think?
Junio C Hamano· Mar 9, 2023, 18:35 UTC · re: Ilia Pozhilov · lore

Re: Track git blame through two unrelated histories

Ilia Pozhilov <ilyapoz@gmail.com> writes:
Show 9 quoted lines
> So let's say I add two remotes and fetch all the commits, but they
> look like this:
>
> A->B-> .... . . . -> Z    history1
>
> 1 -> 2 -> ..... -> 0 history2
>
> and file contents in commits Z and 1 are exactly the same, but the
> commits themselves are completely unrelated for git.

You mean you want to pretend that history "2 -> ... -> 0" was built on top of Z? Here I am assuming that time flows from left to right in the picture.

If so, you should be able to graft the histories together, perhaps?
Totally untested but something like 
	$ git replace --graft 1 Z

based on my reading of "git help replace" should allow you to pretend that Z happened immediately before 1.

Ilia Pozhilov· Mar 13, 2023, 11:48 UTC · re: Junio C Hamano · lore

Re: Track git blame through two unrelated histories

Track git blame through two unrelated histories

Inbox Ilia Pozhilov Thu, Mar 9, 1:05 PM (4 days ago) Hello! I have a weird use case. A repository at my company was migrated git -> non-git vcs -> git again. During transition to non-git vcs the history was lost,

Junio C Hamano <gitster@pobox.com>
Thu, Mar 9, 8:35 PM (4 days ago)

to me, git Ilia Pozhilov <ilyapoz@gmail.com> writes:

Show 9 quoted lines
> So let's say I add two remotes and fetch all the commits, but they
> look like this:
>
> A->B-> .... . . . -> Z    history1
>
> 1 -> 2 -> ..... -> 0 history2
>
> and file contents in commits Z and 1 are exactly the same, but the
> commits themselves are completely unrelated for git.

You mean you want to pretend that history "2 -> ... -> 0" was built on top of Z? Here I am assuming that time flows from left to right in the picture.

If so, you should be able to graft the histories together, perhaps?
Totally untested but something like
        $ git replace --graft 1 Z

based on my reading of "git help replace" should allow you to pretend that Z happened immediately before 1.

Junio C Hamano (gitster@pobox.com), git@vger.kernel.org Plain text

Ilia Pozhilov <ilyapoz@gmail.com>
Fri, Mar 10, 6:32 PM (3 days ago)

to Junio Thank you very much for this! It worked, I found the corresponding commits and did exactly as you suggested. Now blames just work!

Now I will need to figure out if this is push'able to github, but even at this stage it's incredibly useful, I love blames!

On Thu, Mar 9, 2023 at 8:35 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 26 quoted lines
>
> Ilia Pozhilov <ilyapoz@gmail.com> writes:
>
> > So let's say I add two remotes and fetch all the commits, but they
> > look like this:
> >
> > A->B-> .... . . . -> Z    history1
> >
> > 1 -> 2 -> ..... -> 0 history2
> >
> > and file contents in commits Z and 1 are exactly the same, but the
> > commits themselves are completely unrelated for git.
>
> You mean you want to pretend that history "2 -> ... -> 0" was built
> on top of Z?  Here I am assuming that time flows from left to right
> in the picture.
>
> If so, you should be able to graft the histories together, perhaps?
>
> Totally untested but something like
>
>         $ git replace --graft 1 Z
>
> based on my reading of "git help replace" should allow you to
> pretend that Z happened immediately before 1.
>
Ilia Pozhilov· Mar 13, 2023, 11:49 UTC · re: Junio C Hamano · lore

Re: Track git blame through two unrelated histories

Thank you very much for this! It worked, I found the corresponding commits and did exactly as you suggested. Now blames just work!

Now I will need to figure out if this is push'able to github, but even at this stage it's incredibly useful, I love blames!

On Thu, Mar 9, 2023 at 8:35 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 26 quoted lines
>
> Ilia Pozhilov <ilyapoz@gmail.com> writes:
>
> > So let's say I add two remotes and fetch all the commits, but they
> > look like this:
> >
> > A->B-> .... . . . -> Z    history1
> >
> > 1 -> 2 -> ..... -> 0 history2
> >
> > and file contents in commits Z and 1 are exactly the same, but the
> > commits themselves are completely unrelated for git.
>
> You mean you want to pretend that history "2 -> ... -> 0" was built
> on top of Z?  Here I am assuming that time flows from left to right
> in the picture.
>
> If so, you should be able to graft the histories together, perhaps?
>
> Totally untested but something like
>
>         $ git replace --graft 1 Z
>
> based on my reading of "git help replace" should allow you to
> pretend that Z happened immediately before 1.
>

← back to recent threads