How to make an existing directory within a git repository a git submodule

Use git submodule absorbgitdirs

This is what the docs state this command does:

If a git directory of a submodule is inside the submodule,
move the git directory of the submodule into its superprojects
$GIT_DIR/modules path and then connect the git directory and
its working directory by setting the core.worktree and adding
a .git file pointing to the git directory embedded in the
superprojects git directory.

So instead of starting all over as suggested in the previous answers by @DomQ and myself, one can just add run the following:

  1. Without removing from the index the submodule, Add the submodule’s url to .gitmodules and to .git/config with
    git submodule add <url> <path>
  2. (Optional but recommended step) Move the submodule’s $GIT_DIR directory (.git in regular repositories) to .git/modules/<path> with:
    git submodule absorbgitdirs <path>

Original answer – pre v2.12.0

git submodule absorbgitdirs was introduced only in v2.12.0-rc0 (see commit).

The Solution is quite simple. It was extracted from here.

  1. git rm submodule-dir
    This will delete all the files that git was tracking after in submodule-dir
  2. rm -rf submoduledir
    This will delete all the other files that might have been left in submodule-dir because git ignored them.
  3. Now, we have to commit in order to remove the files from the index:
    git commit
    After the commit, we cleaned the files that git followed and didn’t followed in submodul-dir.
    Now it’s time to do:
  4. git submodule add <remote-path-to-submodule>
    This will re-add the submodule but as a true submodule.
  5. At this point it might be a good idea to check .gitmodules and see if the submodules have been added successfully. In my case I already had an .gitmodules file so I had to modify it.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)