Re: How to merge by subtree while preserving history?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mar 27, 2009, at 3:38 AM, Miklos Vajna wrote:

Now do a 'git log f474c52..52b8ea9' and you'll see the merged commits.

Sure :)
Needless to say, this is not practical and doesn't support people's workflow.

For simple renames, "git log --follow" helps, but as soon as you want to do a "diff" in one of the listed revisions, filtering for just this one file, then history becomes invisible again. Concretely, this breaks the common workflow with C-x C-v l, then "d" in Emacs.

I'm aware of the content-tracking vs. file-tracking discussion; it's all fine, except that file names are meaningful meta-data for some content, at least in some projects. Is there a command that gives me the diff for a revision pair, restricted to what happened to content in a given file in the current tree?


But you are right about that 'git log -- path' will find the merge
commits only (which is right, as the tree objects are not modified when
merging, just the resulting tree has the original tree in a
subdirectory).

If this is a one-time operation then I would just use git filter- branch
to move the code to a subdir.


For the record:

In the meantime, I managed to move the original file in the CVS repository (by just moving all the ",v" files and getting rid of CVSROOT/history, which doesn't seem needed). The I re-ran cvsimport, mitigating a bunch of problems with "cvsps". For the record, cvsps / cvsimport could not handle the case where my repository named "foo" had a subdirectory also called "foo", in which I moved all the stuff. I had to rename the directory to "bar". I also had to delete cvsps's cache file with the -x argument (or delete it from the surprising location ~/.cvsps).

Then, I merged with "git pull", noting the rev ID before the merge.

Next, I used "git filter-branch" to rename the directory again from BAR to FOO as follows:

git filter-branch --index-filter \
        'git ls-files -s | sed "s-BAR/-FOO/-" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' <last-rev-before- merge>..

Finally, I had to "git gc" to prune a 200MB worth of objects (it told me I had 500k objects overall).


--
http://aquamacs.org -- Aquamacs: Emacs on Mac OS X
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux