On Thu, 2005-04-14 at 17:42 -0700, Linus Torvalds wrote:
> I've not even been convinved that renames are worth it. Nobody has
> really given a good reason why.
> There are two reasons for renames I can think of:
> - space efficiency in delta-based trees.
> - "annotate".
Neither of those were my motivation for looking at renames. The reasons
I wanted to track renames were:
- Per-file revision history which doesn't stop dead at a rename.
- Merging where files have been renamed in one branch and modified in
another. Which is basically a special case of the above; we need to
see the per-file revision history.
> So I'd seriously suggest that instead of worryign about renames, people
> think about global diffs that aren't per-file. Git is good at limiting
> the changes to a set of objects, and it should be entirely possible to
> think of diffs as ways of moving lines _between_ objects and not just
> within objects. It's quite common to move a function from one file to
> another - certainly more so than renaming the whole file.
> In other words, I really believe renames are just a meaningless special
> case of a much more interesting problem. Which is just one reason why
> I'm not at all interested in bothering with them other than as a "data
> moved" thing, which git already handles very well indeed.
Git doesn't handle 'data moved' except at a whole-tree level. For each
commit, it says "these are the old trees; this is the new tree".
Git doesn't actually look hard into the contents of tree; certainly it
has no business looking at the contents of individual files; that is
something that the SCM or possibly only the user should do. The storage
of 'rename' information in the commit object is another kind of 'xattr'
storage which git would provides but not directly interpret.
And you're right; it shouldn't have to be for renames only. There's no
need for us to limit it to one "source" and one "destination"; the SCM
can use it to track content as it sees fit.
As I said, the main aim of this is to track revision history of given
content, for displaying to the user and for performing merges. So when a
file is split up, or a function is moved from it to another file, a
'rename' xattr can be included to mark that files 'foo' and 'bar' in the
new tree are both associated with file 'wibble' in the parent.
That's as much as we need to provide for content tracking, and it _does_
handle the general case as well as we should be attempting to. We don't
want to get into dealing with file contents ourselves; we just want to
store the hint for the SCM or the user that "your data went thataway".
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html