I have a project of which I am interested in breaking out portions as open-source. I've set up nested git repositories main, one, two and three:
main/
├── one
├── three
└── two
I thought that by going into "main" and doing
git add one
git add two
git add three
(note the lack of trailing slashes), I'd set up submodules with the sub-repositories and be good to go.
However, as noted in How to track untracked content?, this only creates gitlinks and not real submodules.
Unfortunately, that answer doesn't help, as it assumes that there is a "master" repository somewhere else for "main/one", "main/two", and "main/three". I'd like these sub-repo's to be the master repositories. I'm considering fake submodules (as per Git fake submodules), but that's not a particularly ideal situation for cloning.
Any other suggestions out there?
You can do what you want, but your one
, two
, and three
would need to be accessible to whoever will need to clone them—this is not usually the case for “random” development repositories.
If you do set this up, you will need to be very careful not to delete “your” repository (or make it otherwise inaccessible) since it is not just “yours”: it will be origin in your collaborator’s clones and it will serve as the “central”/“upstream” repository (as specified in .gitmodules
).
If all your collaborators are local (and can read from the repositories), you can add your existing sub-repositories as submodules by giving their local paths as URLs:
git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three
If not all your collaborators will be working on the same machine, then that will probably not work correctly (since it will store a local path in .gitmodules
; non-local collaborators would have to adjust the URLs after git submodule init
).
If your one
, two
, and three
are remotely Git-accessible, then you can specify their effecive URLs instead:
git rm --cached one two three
git submodule add server:/path/to/your/main/one
git submodule add server:/path/to/your/main/two
git submodule add server:/path/to/your/main/three
In both cases, since you already have a sub-repository in place, git submodule add
will use that instead of trying to clone from the specified path/URL.