Thread (3 messages) flat view 3 messages, 2 authors, 2021-08-14

Re: 'git log' doesn't keep log of un-removed and then renamed directory

From: Chris Torek <hidden>
Date: 2021-08-14 10:21:35

On Sat, Aug 14, 2021 at 2:21 AM Yuri [off-list ref] wrote:
In the FreeBSD ports tree I restored the previously removed directory
math/dynare:

1. git checkout 3fb72e318f7be~1 -- math/dynare
[remaining complex shuffling action that mimics what's needed
in SVN, snipped]

Git is not SVN; do not expect it to behave *like* SVN.

In particular, Git does not have file history.  Git has only commits.

SVN has commits, but SVN commits contain file history.  In Git, the
commits *are* the history, and are the *only history*.  Each commit has
a full snapshot of every file, under the names you told Git to use, with
the contents that you told Git to save.

The command `git log science/dynare` tells Git: Look through
commits, one by one, and whenever there's a file whose name
starts with `science/dynare` that's different in *this* commit, vs the
previous one, tell me about this commit.  Since the old commits
have files named `math/dynare/something` instead, Git doesn't
tell you about them.

The `git log` command has a flag, `--follow`, that has a trick up its
sleeve (wait: does `git log` have sleeves? well, anyway). This trick
is a bit limited though. Let's say there's a README file in the
science/dynare/ directory, as of the latest commit.  If you run:

    git log --follow science/dynare/README

Git will look at *this* commit and find the file, and will look at this
commit's *parent* and *not* find the file, because the parent does
not have `science/dynare/README` in it.  But the parent does
have `math/dynare/README` in it *and that file exactly matches*
this commit's copy.  So `git log` will tell you about this commit and
say that the file was *renamed*.  From this point backwards,
`git log` will be looking, not for `science/dynare/README`, but
instead for `math/dynare/README`.

Unfortunately, the `--follow` trick only works on *one file*. But it
will let you know that if you re-run your `git log` with `math/dynare`
you can see what happened before the renaming.

A future `git log` really should be smarter about detecting the
whole-subtree renaming, and be able to follow it.  This won't
require any change in the repository, just a smarter `git log`.
But someone has to write that smarter `git log`.

Chris
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help