# Track git blame through two unrelated histories

4 messages from 2023-03-09 to 2023-03-13. Participants: Ilia Pozhilov, Junio C Hamano.
Thread: https://gitlist.dev/t/59366

## Ilia Pozhilov, 2023-03-09 11:05

Subject: Track git blame through two unrelated histories
Message-ID: <CAAo-ADZBBRxSROeAwrA9o30Etf3QQhLCaWQJtVsChVwT-AbgTg@mail.gmail.com>
URL: https://gitlist.dev/e/CAAo-ADZBBRxSROeAwrA9o30Etf3QQhLCaWQJtVsChVwT-AbgTg%40mail.gmail.com

```
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, 2023-03-09 18:35

Subject: Re: Track git blame through two unrelated histories
Message-ID: <xmqqwn3pai2d.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqwn3pai2d.fsf%40gitster.g
In-Reply-To: <CAAo-ADZBBRxSROeAwrA9o30Etf3QQhLCaWQJtVsChVwT-AbgTg@mail.gmail.com>

```
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, 2023-03-13 11:48

Subject: Re: Track git blame through two unrelated histories
Message-ID: <CAAo-ADbDW3WCuRFCnNopg31B_hDumz5qVOzirczG70odSVa6Bw@mail.gmail.com>
URL: https://gitlist.dev/e/CAAo-ADbDW3WCuRFCnNopg31B_hDumz5qVOzirczG70odSVa6Bw%40mail.gmail.com
In-Reply-To: <xmqqwn3pai2d.fsf@gitster.g>

```
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:

> 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:
>
> 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, 2023-03-13 11:49

Subject: Re: Track git blame through two unrelated histories
Message-ID: <CAAo-ADbUf1UqSE1EFf1yOY5Mhu0R5_NQuK8agBpOn60zgpWnVQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAAo-ADbUf1UqSE1EFf1yOY5Mhu0R5_NQuK8agBpOn60zgpWnVQ%40mail.gmail.com
In-Reply-To: <xmqqwn3pai2d.fsf@gitster.g>

```
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:
>
> 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.
>

```
