git-stitch-repo - Stitch several git repositories into a git-fast-import stream
git-stitch-repo repo1 repo2:dir2 ...
git-stitch-repo will process the output of git-fast-export --all --date-order on the git repositories given on the command-line, and create a stream suitable for git-fast-import that will create a new repository containing all the commits in a new commit tree that respects the history of all the source repositories.
git-fast-export --all --date-order
Typical usage is like this:
$ ls A B $ mkdir RESULT $ cd RESULT $ git-init $ git-stitch-repo ../A:A ../B:B | git-fast-import
The RESULT repository will contain all commits from repositories A and B, with the files from A in subdirectory A/ and the files from B in subdirectory B/.
RESULT
git-stich-repo works perfectly with repositories that have a linear history (no merges). It has successfully been tested with 16 linear repositories, and produced the expected result.
Imagine we have two repositories A and B that we want to stitch into a repository C so that all the files from A are in subdirectory A and all the files from B are in subdirectory B.
Note: in the following ASCII art graphs, horizontal order is chronological.
Repository A:
topic ' ,master ,----A3---A5 / / A1--A2---A4---'
Branch master points to A5 and branch topic points to A3.
Repository B:
,topic ,master ,---------B3---B5---B7---B8 / / B1---B2---B4---B6--------'
Branch master points to B8 and branch topic points to B5.
The RESULT repository should preserve chronology, commit relationships and branches as much as possible, while giving the impression that the directories A/ & B/ did live side-by-side all the time.
Assuming additional timestamps not shown on the above graphs, git-stitch-repo will produce a git-fast-import stream that will create the following history:
,topic-A ,---------------A3---B3 master-A / \ ' ,topic-B / ,--------------A5---B5 / / \ ,master-B A1---B1---A2---B2---A4---B4---B6-----------------B7---B8
Any mathematician will tell you there are many many ways to stitch two trees together. This programs tries very hard not to create inconsistent history with regard to each input repository.
The current implementation can (and will be) improved. I'm very interested in test repositories that do not give the expected results.
One of the issues is that we currently refuse to stitch a node after a merge from another repository. For the current example, that would mean that any commit having A5 as a parent would be attached to B5, and not to B8.
Fixing this is in the TODO list.
Philippe Bruhat (BooK), <book@cpan.org>.
<book@cpan.org>
The original version of this script was created as part of my work for BOOKING.COM, which authorized its publication/distribution under the same terms as Perl itself.
Copyright 2008 Philippe Bruhat (BooK), All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Git::FastExport, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Git::FastExport
CPAN shell
perl -MCPAN -e shell install Git::FastExport
For more information on module installation, please visit the detailed CPAN module installation guide.