threads / discuss / 54880

How to integrate external repo into existing directory of a bigger repo (git subtree)?

Subject: How to integrate external repo into existing directory of a bigger repo (git subtree)?

## tl;dr

2 messages between Dec 24, 2020 and Dec 25, 2020.

replies: 1people: 1as markdown or json

Manuel Reimer· Dec 24, 2020, 14:53 UTC · lore
Hello,

some while ago (before I found out that "git subtree" exists), I've set up a big GIT repo consisting of several smaller modules. It was way more convenient to maintain them all in one repository compared to having each in its own repository.

As I need a separate repository per module for technical reasons, I wrote a shellscript which temporarily checks out the external repository, deletes all files, places the files from my big repo, creates a generic commit with auto-generated commit message and then pushes this to the server.

So what I have now is:
- Big repo consisting of many small modules, each one in its own
   directory with proper commit messages
- Several external repositories with autogenerated commit messages
What I want to do is porting this over to "git subtree" somehow, but:
- I would prefer to not loose history in the "big repo"
- I can't force-push to the small external repositories (blocked)

Is there any chance to somehow "restart" the history of an existing directory in a way to reproduce the commits of the external repository so "git subtree" works as intended and I can "git subtree push" without running into the server side "force push" block? I know that reorganizing my whole big repo would do the trick as the subtree would be added to a directory that never existed, but I would prefer to keep it organized the way it is.

Thanks in advance
Manuel
Manuel Reimer· Dec 25, 2020, 10:12 UTC · re: Manuel Reimer · lore

Re: How to integrate external repo into existing directory of a bigger repo (git subtree)?

On 24.12.20 15:53, Manuel Reimer wrote:
> What I want to do is porting this over to "git subtree" somehow, but:
> 
> - I would prefer to not loose history in the "big repo"
> - I can't force-push to the small external repositories (blocked)
Just for the record: I found a way to fix this properly.
The way to go is:
- Create a new, empty, GIT repository (git init)
- For some reason (bug?) "git subtree" fails on a completely new repo, 
so I had to add one initial commit (I used this to add a small helper 
shellscript that I want to use to simplify my "git subtree" work).
- Now add all the wanted "git subtrees" from their existing "external 
repositories" to the, so far, nearly empty repo. This creates a proper 
"Add ..." commit which seems to be the key to not break pushing to the 
external repo.
- After adding all subtrees, pull from the "big repo", resolve conflicts 
and create a merge commit.

At this point I was able to "git subtree push" without needing to force. This also transferred proper history for the subtrees to the individual external repos. Even the final push to my "big repo" worked without forcing.

Regards,
Manuel

← back to recent threads