threads / discuss / 11784

Can git log <file> follow log of its origins?

Subject: Can git log <file> follow log of its origins?

## tl;dr

7 messages between Jan 29, 2008 and Jan 29, 2008.

replies: 6people: 3as markdown or json

Max Pollard· Jan 29, 2008, 17:48 UTC · lore
Hi all,
If I do the following:
     $ git init
     $ echo "The brown fox is getting old" > a.txt
     $ git add a.txt
     $ git commit -m "Commit a.txt"
     $ cp a.txt b.txt
     $ git add b.txt
     $ git commit -m "Copy a.txt to b.txt"
     $ git log b.txt

I only see the log corresponding to the 2nd commit (v1.5.3.5). Is it possible to have the above command keep going and show the history of a.txt? Or at least somehow indicate that b.txt originated from a.txt?

Thanks, MP

      ____________________________________________________________________________________
Never miss a thing.  Make Yahoo your home page. 
http://www.yahoo.com/r/hs
Sean· Jan 29, 2008, 18:17 UTC · re: Max Pollard · lore

Re: Can git log <file> follow log of its origins?

On Tue, 29 Jan 2008 09:48:05 -0800 (PST) Max Pollard <ajaxsupremo@yahoo.com> wrote:

Show 16 quoted lines
> If I do the following:
> 
>      $ git init
>      $ echo "The brown fox is getting old" > a.txt
>      $ git add a.txt
>      $ git commit -m "Commit a.txt"
> 
>      $ cp a.txt b.txt
>      $ git add b.txt
>      $ git commit -m "Copy a.txt to b.txt"
> 
>      $ git log b.txt
> 
> I only see the log corresponding to the 2nd commit (v1.5.3.5).  Is it possible
> to have the above command keep going and show the history of a.txt?  Or at
> least somehow indicate that b.txt originated from a.txt?
Hi Max,

Not sure it will leave you feeling totally satisfied but the following command will at least show you the copy which occurred in that commit:

$ git log --full-diff -C --find-copies-harder --stat -- b.txt
commit 578ecbc516e70ce7178545233192a08369a07101
Author: xyz <x@y.z>
Date:   Tue Jan 29 13:11:16 2008 -0500
    Copy a.txt to b.txt
 a.txt => b.txt |    0 
 1 files changed, 0 insertions(+), 0 deletions(-)

If you had done a rename instead of a copy, then "git log --follow b.txt" would have done what you're looking for, but there is no corresponding option to follow copies.

HTH, Sean

Max Pollard· Jan 29, 2008, 19:47 UTC · re: Sean · lore

Re: Can git log <file> follow log of its origins?

--- Sean wrote:
Show 26 quoted lines
> On Tue, 29 Jan 2008 09:48:05 -0800 (PST)
> Max Pollard wrote:
> 
> > I only see the log corresponding to the 2nd commit (v1.5.3.5).  Is it
> > possible to have the above command keep going and show the history of
> > a.txt?  Or at least somehow indicate that b.txt originated from a.txt?
> 
> Hi Max,
> 
> Not sure it will leave you feeling totally satisfied but the
> following command will at least show you the copy which
> occurred in that commit:
> 
> $ git log --full-diff -C --find-copies-harder --stat -- b.txt
> commit 578ecbc516e70ce7178545233192a08369a07101
> Author: xyz <x@y.z>
> Date:   Tue Jan 29 13:11:16 2008 -0500
> 
>     Copy a.txt to b.txt
> 
>  a.txt => b.txt |    0 
>  1 files changed, 0 insertions(+), 0 deletions(-)
> 
> If you had done a rename instead of a copy, then "git log --follow b.txt"
> would have done what you're looking for, but there is no corresponding option
> to follow copies.

Many thanks for that Sean. I saw all the options in the manual, but couldn't figure out how to put them together.

This is exactly the information I wanted. It appears to identify copies in both text & binary files even if contents of b.txt are modified before commit (or at least modified in ways the copy-detection logic can identify copies).

MP
      ____________________________________________________________________________________
Be a better friend, newshound, and 
know-it-all with Yahoo! Mobile.  Try it now.  http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ 
Junio C Hamano· Jan 29, 2008, 20:03 UTC · re: Max Pollard · lore

Re: Can git log <file> follow log of its origins?

Max Pollard <ajaxsupremo@yahoo.com> writes:
Show 14 quoted lines
> If I do the following:
>
>      $ git init
>      $ echo "The brown fox is getting old" > a.txt
>      $ git add a.txt
>      $ git commit -m "Commit a.txt"
>
>      $ cp a.txt b.txt
>      $ git add b.txt
>      $ git commit -m "Copy a.txt to b.txt"
>
>      $ git log b.txt
>
> I only see the log corresponding to the 2nd commit (v1.5.3.5).

That is what you are asking "git log" to show. "git log b.txt" means "please simplify the history by throwing away commits that do not have changes to paths that match b.txt, and then show the resulting log with the change pertaining to that path". The first commit does not change a path called b.txt (in other words, "git show --stat HEAD^" will not give diffstat for "b.txt"), so that commit is not shown.

$ git log --pretty=oneline --name-status -C -C
Max Pollard· Jan 29, 2008, 21:07 UTC · re: Junio C Hamano · lore

Re: Can git log <file> follow log of its origins?

--- Junio C Hamano wrote:
Show 14 quoted lines
> Max Pollard writes:
> 
> > I only see the log corresponding to the 2nd commit (v1.5.3.5).
> 
> That is what you are asking "git log" to show.  "git log b.txt"
> means "please simplify the history by throwing away commits that
> do not have changes to paths that match b.txt, and then show the
> resulting log with the change pertaining to that path".  The
> first commit does not change a path called b.txt (in other
> words, "git show --stat HEAD^" will not give diffstat for "b.txt"),
> so that commit is not shown.
> 
> $ git log --pretty=oneline --name-status -C -C
> 

Got it - many thanks. So -C -C is the answer, with --name-status or --stat to actually show the result. From the code, a status like Cxxx appears to contain the "similarity percentage" in xxx; so that C100 would mean an exact copy...

MP
      ____________________________________________________________________________________
Be a better friend, newshound, and 
know-it-all with Yahoo! Mobile.  Try it now.  http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ 
Junio C Hamano· Jan 29, 2008, 21:21 UTC · re: Max Pollard · lore

Re: Can git log <file> follow log of its origins?

Max Pollard <ajaxsupremo@yahoo.com> writes:
Show 17 quoted lines
>> Max Pollard writes:
>> 
>> > I only see the log corresponding to the 2nd commit (v1.5.3.5).
>> 
>> That is what you are asking "git log" to show.  "git log b.txt"
>> means "please simplify the history by throwing away commits that
>> do not have changes to paths that match b.txt, and then show the
>> resulting log with the change pertaining to that path".  The
>> first commit does not change a path called b.txt (in other
>> words, "git show --stat HEAD^" will not give diffstat for "b.txt"),
>> so that commit is not shown.
>> 
>> $ git log --pretty=oneline --name-status -C -C
>> 
>
> ...  So -C -C is the answer, with --name-status or --stat to
> actually show the result.

The real "answer" part in that example is not -C -C. Obviously, you would need double-C aka --find-copies-harder, because you did not change a.txt when creating b.txt, so it is still needed.

But the essential part of the answer is "not giving b.txt as the pathspec, so that whatever _other_ file that could have been copied into it is still visible when the command works".

If you say "git log --name-status -C -C -- b.txt", you would be back to square one.

Max Pollard· Jan 29, 2008, 21:40 UTC · re: Junio C Hamano · lore

Re: Can git log <file> follow log of its origins?

--- Junio C Hamano wrote:
Show 15 quoted lines
> Max Pollard writes:
> 
> > ...  So -C -C is the answer, with --name-status or --stat to
> > actually show the result.
> 
> The real "answer" part in that example is not -C -C.  Obviously,
> you would need double-C aka --find-copies-harder, because you
> did not change a.txt when creating b.txt, so it is still needed.
> 
> But the essential part of the answer is "not giving b.txt as the
> pathspec, so that whatever _other_ file that could have been
> copied into it is still visible when the command works".
> 
> If you say "git log --name-status -C -C -- b.txt", you would be
> back to square one.
Aha, point taken.  In this case, looks like I can do:
    $ git log -C -C --full-diff --name-status/--stat/--summary -- b.txt

as Sean has suggested to get the copy information back. Or are you saying that even with "--full-diff" I can lose copy information in some cases?

MP
      ____________________________________________________________________________________
Looking for last minute shopping deals?  
Find them fast with Yahoo! Search.  http://tools.search.yahoo.com/newsearch/category.php?category=shopping

← back to recent threads