git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re[2]: Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?

From
Алексей Шумкин <zapped@mail.ru>
Date
Jan 11, 2011, 14:49 UTC
Message-ID
<961742587.20110111174907@mail.ru>
In-Reply-To
<m3lj2rbmq5.fsf@localhost.localdomain>
Hello, Jakub.
Thank you very much. Your method works great and it suits for me well
Show 15 quoted lines
>> 1.5 years ago I had sources of a project in a SVN repository (actually it does not
>> matter what SCM was used before). And I had two branches: v2.4 and v2.5.
>> They differed enough at that moment and (as usual for SVN branches)
>> laid in two different folders.
>> Then I had known of Git and I decided to try to use this powerful DVCS.
>> But as I was a newbie I created two git-repositories: one per each
>> branch. So v2.4 has its own git-repo. v2.5 (and above) has another one.
>> 
>> Now I'd like to merge them as v2.5 was a continuos branch from v2.4,
>> but without a rebasing (i.e. without a global changing of v2.5
>> repository, which already has another branches)
>> It must look like LAST commit of v2.4 should be a PARENT of FIRST commit of v2.5
>> 
>> Now there's a question: Is it possible to do so (no rebasing!), and If
>> "yes" then how to?

JN> As Andreas Ericsson wrote, you can do this using grafts (and you can JN> make history with grafts permanent using "git filter-branch").

JN> Better solution might be to use more modern replace mechanism, see JN> e.g. "git replace" manpage. Below there is untested step-by-step JN> instruction.

JN> First, you have put history of v2.4 and of v2.5 in a single repository JN> (e.g. using "git remote add"). Then you need to find FIRST commit of JN> v2.5 among

JN>   $ git rev-list master --parents | grep -v ' '

JN> The above finds all parent-less commits in 'master' branch; replace it JN> with branch holding v2.5 history. Then you need to find LAST commit JN> of v2.4 and its SHA-1, e.g. via

JN>   $ git rev-parse v2.4
JN> Save current state of FIRST commit of v2.5 to a file
JN>   $ git cat-file -p FIRST > tmp

JN> Edit this file, adding 'parent' line between 'tree' and 'author' JN> headers, so the header of this file looks like the following:

JN> tree 13d050266e05f7c66000240814199fcf3b559d43 JN> parent ada9983c4256f5a7bac1f7f0e29d52011741d6aa JN> author Jakub Narebski <jnareb@gmail.com> 1294231771 +0100

JN> (trailing space added for better readibility).
JN> Then you need to add newly created object to repository:
JN>   $ git hash-object -t commit -w tmp
JN> and then use it as replacement
JN>   $ git replace <SHA-1 of FIRST> <SHA-1 returned by hash-object>
JN> Finally check that replacement works, e.g.:

JN> $ git show FIRST JN> $ git log --graph --oneline -3 FIRST

JN> The anyone who would fetch refs/replace/ would get joined history, and JN> who doesn't would see it not connected.

JN> P.S. This probably should made it into Documentation/howto
Previous: Jakub NarebskiNext: Алексей Шумкин
Message 8 of 18 in “Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?”
  1. Алексей ШумкинJan 11, 2011
  2. Martin KrügerJan 11, 2011
  3. Re[2]: Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?Алексей Шумкин, Jan 11, 2011
  4. Andreas EricssonJan 11, 2011
  5. Re[2]: Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?Алексей Шумкин, Jan 11, 2011
  6. Martin KrügerJan 11, 2011
  7. Jakub NarebskiJan 11, 2011
  8. Re[2]: Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?Алексей Шумкин, Jan 11, 2011
  9. Re[2]: Merge two different repositories (v2.4 + v2.5) into the one (v2.4 -> v2.5). Possible?Алексей Шумкин, Jan 11, 2011
  10. Documentation: start to explain what git replace is forJonathan Nieder, Jan 12, 2011
  11. MaaartinJan 12, 2011
  12. Alexey ShumkinJan 13, 2011
  13. 2/1 fixup! Documentation: start to explain what git replace is forJonathan Nieder, Jan 14, 2011
  14. Maaartin-1Jan 14, 2011
  15. Jonathan NiederJan 14, 2011
  16. how multiple roots happen (Re: [RFC/PATCH 2/1] fixup! Documentation: start to explain what git replace is for)Jonathan Nieder, Jan 14, 2011
  17. Jakub NarebskiJan 14, 2011
  18. Maaartin-1Jan 15, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.