From: Andy Parkins <andyparkins@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Subject: Moving a directory with history from one repository to another while renaming
Date: Thu, 21 Jun 2007 13:37:30 +0100 [thread overview]
Message-ID: <200706211337.32978.andyparkins@gmail.com> (raw)
Hello,
I'm sure this has come up before, and I'm sure the answer is
git-filter-branch.
I have repositoryA, which has a subdirectory, say "repoA_directory", and I've
done some development in it. I now wish I'd done this development in a
different repository, repositoryB and that it would have been in a different
directory, "sub/dir/repoB_directory".
What's the best way to do this?
*** Stop press (I tried a bit harder before sending the above email) ***
This is what I did, and am reporting here for future googlers; and in case
you're all interested in git-filter-branch success stories (which,
incidentally is a fabulous little tool).
In repositoryA...
git-filter-branch --subdirectory-filter "repoA_directory" directoryonly
Now, the branch "directoryonly" contains repoA_directory (and history) as a
new root commit, and as the root directory of the repository.
git checkout directoryonly
git-filter-branch --tree-filter "mkdir -p sub/dir/repoB_directory; \
mv file1 file2 file3 sub/dir/repoB_directory" directorymoved
Now, the branch "directorymoved" contains repoA_directory (and history) alone,
moved to "sub/dir/repoB_directory".
In repositoryB...
git-fetch /path/to/repositoryA directorymoved:repoAbranch
repositoryB now contains a new, independently rooted, branch containing only
sub/dir/repoB_directory. We would ideally at this point just rebase that
independent branch to the appropriate point in the main development branch of
repoB, but we can't because repoAbranch doesn't share a common ancestor with
any of the repositoryB branches.
That is to say, we have these two branches:
* --- * --- * --- * --- * (master)
B --- * --- * (repoAbranch)
but we want:
* --- * --- * --- * --- * (master)
\
B --- * --- * (repoAbranch)
Find the commit hash of the first commit in repoAbranch, B, and apply that one
commit as a patch to your mainline branch (probably making a temporary branch
on your way, to preserve your current master)
git checkout -b temp
git show --pretty=email hash-of-B | git-am
* --- * --- * --- * --- * (master)
\
B' (temp)
B --- * --- * (repoAbranch)
We've now got a commit that will serve as a common ancestor.
git-rebase --onto temp hash-of-B repoAbranch
git-branch -D temp
* --- * --- * --- * --- * (master)
\
B' --- *' --- *' (repoAbranch)
B --- * --- * [orphan branch]
Voila. repoAbranch is now the original repoA_directory, but stored at
sub/dir/repoB_directory and includes the development history.
git-gc --prune will get rid of the orphan branch if you're bothered about the
storage.
Andy
--
Dr Andy Parkins, M Eng (hons), MIET
andyparkins@gmail.com
next reply other threads:[~2007-06-21 12:37 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-21 12:37 Andy Parkins [this message]
2007-06-21 13:01 ` Moving a directory with history from one repository to another while renaming Jeff King
2007-06-21 13:57 ` Andy Parkins
2007-06-21 14:05 ` Johannes Schindelin
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=200706211337.32978.andyparkins@gmail.com \
--to=andyparkins@gmail.com \
--cc=git@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.