Search code examples
gitgit-submodules

Opposite/reverse of "git submodule absorbgitdirs"?


How can I do the reverse of git submodule absorbgitdirs? I.e. move a submodule's .git information out of superproject/.git/modules/<module> and back to the superproject/path/to/<module>/.git directory?

I still want <module> to be a submodule of superproject, I just don't want <module>'s .git directory info in superproject's .git/modules directory.


Solution

  • Note that this would make superproject/path/to/<module>/ a nested Git repo, whose SHA1 would still be recorded by the parent project.

    To keep the exact same state, you can copy superproject/.git/modules/<module> and rename to superproject/path/to/<module>, and rename <module>/<module> to <module>/.git.

    Then you can use the git submodule deinit to remove the submodule:

    mv asubmodule asubmodule_tmp
    git submodule deinit -f -- a/submodule    
    rm -rf .git/modules/a/submodule
    
    # if you want to leave it in your working tree
    git rm --cached asubmodule
    mv asubmodule_tmp asubmodule
    

    I still want to be a submodule of superprojec

    Then its .git folder would be in superproject/.git/modules/<module>

    submodule absorbgitdirs does not leave any choice:

    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.

    I don't see in git config any configuration that might move $GIT_DI R/modules.

    absorbgitdirs was introduced in commit f6f8586 for Git 2.12 (Q4 2016)
    Its tests shows it expects to use GIT_DIR/modules.

    Older Git (before Git 1.7.8, Oct. 2011) had a .git directly inside the submodule folder.


    As noted by Jeremiah Rose in the comments:

    Another use case is: if you are using a Docker container to use git commands inside a submodule, where the container can't see the superproject and errors out. :(