git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Avery Pennarun" <apenwarr@gmail.com>
To: "Linus Torvalds" <torvalds@linux-foundation.org>
Cc: "Robin Rosenberg" <robin.rosenberg.lists@dewire.com>,
	"Ittay Dror" <ittayd@tikalk.com>,
	git@vger.kernel.org
Subject: Re: merge renamed files/directories?
Date: Mon, 5 May 2008 21:38:26 -0400	[thread overview]
Message-ID: <32541b130805051838k367c44bau715774b46f7894cb@mail.gmail.com> (raw)
In-Reply-To: <alpine.LFD.1.10.0805051512060.32269@woody.linux-foundation.org>

On 5/5/08, Linus Torvalds <torvalds@linux-foundation.org> wrote:
>  I really don't understand why people expect a directory rename to be
>  handled automatically, when it is (a) not that common and (b) not obvious
>  what the solution is, but MOST OF ALL (c) so damn _easy_ to handle it
>  manually after-the-fact when you notice that something doesn't compile!

I general I agree with your point here, but I still find it surprising
how hard the directory-rename problem is made out to be.  As far as I
can see, the right implementation exactly parallels the single-file
rename implementation.

I think the same problem that prevents git from knowing the difference
between empty and nonexistent directories (eg.
http://kerneltrap.org/mailarchive/git/2007/7/18/251976) is the one
that prevents it from handling directory renames: git doesn't
acknowledge that it's *already* treating directories as first-class
objects.

What if you thought of a directory as simply a list of filenames?
(This is more or less what unix does anyway.)  Then an *empty*
directory is a tree of zero length; a nonexistent (or not tracked)
directory is simply not listed in the parent; a directory with
untracked files is like a file with patches not yet added to the
index(*); and trying to merge a file into a nonexistent directory
(when the original patch *didn't* create the directory fresh) would
trigger similar logic to the existing rename handling.  That is, put
the new file with the content that used to be next to it, by looking
for a tree with contents (names, not so much sha1's) similar to the
one it was expected to be in.

> It really is mental
> masturbation, and has absolutely no relevance for any real-world problem.

I personally don't get very interested in non-real-world problems.
Here's the actual case I tried to use a few months ago, but couldn't,
because git doesn't track directory renames.  (Note that I was quite
happily able to do this in svn, as much as you can do anything happily
in svn.)

I have a branch called 'mylib' with my library project in its root
directory.  What I wanted was to maintain my library in the 'mylib'
branch, then merge my library into the "libs/mylib" directory of my
application, which is in the 'myapp' branch.  (Of course, in real
life, there's more than one app using mylib in more than one
repository, and I'm actually doing 'git pull' of the mylib branch from
elsewhere.)

This actually works like magic in git - except when you create a file
in the 'mylib' branch, in which case it gets merged to the wrong path
every single time.  It seems to me like it should be very easy to put
it in the right place instead, making one more interesting use case
possible.

I realize git-submodule is the way you're supposed to do something
like this, but git-submodule doesn't really do what I want (yet) for
reasons discussed in other threads.

Have fun,

Avery

(*) Applying the same metaphor in reverse, operations that are valid
on directories are also valid for file contents.  I can think of
immediate uses for a .gitignore-style list that talks about file
*contents*.  Imagine if I could make a local patch to my Makefile,
mark that one patch as "ignored", and never accidentally check it in.

  parent reply	other threads:[~2008-05-06  1:39 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-01 14:10 detecting rename->commit->modify->commit Ittay Dror
2008-05-01 14:45 ` Jeff King
2008-05-01 15:08   ` Ittay Dror
2008-05-01 15:20     ` Jeff King
2008-05-01 15:30       ` Ittay Dror
2008-05-01 15:38         ` Jeff King
2008-05-01 15:47         ` Jakub Narebski
2008-05-01 20:39       ` Teemu Likonen
2008-05-01 23:09         ` Jeff King
2008-05-02  2:06         ` Sitaram Chamarty
2008-05-02  2:38           ` Junio C Hamano
2008-05-02 16:59             ` Sitaram Chamarty
2008-05-01 15:24     ` Ittay Dror
2008-05-01 15:28       ` Jeff King
2008-05-01 14:54 ` Ittay Dror
2008-05-01 15:09   ` Jeff King
2008-05-01 15:20     ` Ittay Dror
2008-05-01 15:30     ` David Tweed
2008-05-01 15:27   ` Avery Pennarun
2008-05-01 15:34     ` Jeff King
2008-05-01 15:50       ` Avery Pennarun
2008-05-01 16:48         ` Jeff King
2008-05-01 19:45           ` Avery Pennarun
2008-05-01 22:42             ` Jeff King
2008-05-01 19:12       ` Steven Grimm
2008-05-01 23:14         ` Jeff King
2008-05-03 17:56           ` merge renamed files/directories? (was: Re: detecting rename->commit->modify->commit) Ittay Dror
2008-05-03 18:11             ` Avery Pennarun
2008-05-04  6:08               ` merge renamed files/directories? Ittay Dror
2008-05-04  9:34                 ` Jakub Narebski
2008-05-05 16:40                 ` Avery Pennarun
2008-05-05 21:49                   ` Robin Rosenberg
2008-05-05 22:20                     ` Linus Torvalds
2008-05-05 23:07                       ` Steven Grimm
2008-05-06  0:29                         ` Linus Torvalds
2008-05-06  0:40                           ` Linus Torvalds
2008-05-06 15:47                           ` Theodore Tso
2008-05-06 16:10                             ` Linus Torvalds
2008-05-06 16:15                               ` Linus Torvalds
2008-05-06 16:32                               ` Ittay Dror
2008-05-06 16:39                                 ` Linus Torvalds
2008-05-06  1:38                       ` Avery Pennarun [this message]
2008-05-06  1:46                         ` Shawn O. Pearce
2008-05-06  1:58                           ` Avery Pennarun
2008-05-06  2:12                             ` Shawn O. Pearce
2008-05-06  2:19                         ` Linus Torvalds
2008-05-08 18:17           ` detecting rename->commit->modify->commit Jeff King
2008-05-01 16:39   ` Sitaram Chamarty
2008-05-01 18:58     ` Ittay Dror

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=32541b130805051838k367c44bau715774b46f7894cb@mail.gmail.com \
    --to=apenwarr@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=ittayd@tikalk.com \
    --cc=robin.rosenberg.lists@dewire.com \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).