From: Petr Baudis Date: Wed, 18 Jan 2006 12:58:57 GMT Subject: Re: Joining Repositories Message-ID: <20060118125857.GO28365@pasky.or.cz> In-Reply-To: <20060118125158.GN28365@pasky.or.cz> Dear diary, on Wed, Jan 18, 2006 at 01:51:58PM CET, I got a letter where Petr Baudis said that... > But if you want r1/a, r2/b to turn to r/r1/a, r/r2/b, you will have > to rewrite the history of each (and then do the above). One rough > and untested sketch... > > mkdir r1-rewritten > cd r1-rewritten > cp -a ../r1/.git . mkdir commitmap > for commit in $(git-rev-list --topo-order HEAD | tac); do > git-read-tree --prefix=r1/ $commit > # here, setup the AUTHOR/COMMITTER variables > # appropriately (you can look at cg-commit's > # $copy_commit handler) > git-cat-file commit "$commit" | sed -e '1,/^$/d' | \ > git-commit-tree $(git-write-tree) \ > $(for parent in $(cg-object-id -p $commit); do echo -p > cat commitmap/$parent > done) >commitmap/$commit > last_commit=$commit > done > git-update-ref HEAD $(cat commitmap/$last_commit) rm -rf commitmap cg-reset And at this point, git-prune will have plenty of work to do (many of your tree and commit objects will be outdated - you just rewrote them). It's quite beautiful that you can do this all without checkouting a single thing - you just load the tree to the index, prepend "r1/" to all the paths, and commit it back. -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ Of the 3 great composers Mozart tells us what it's like to be human, Beethoven tells us what it's like to be Beethoven and Bach tells us what it's like to be the universe. -- Douglas Adams