gitgit-submodules

How to add already cloned projects as submodules?


I have in a folder a large number of projects that I cloned for quite some time; recently I moved this whole folder into one of my repos and would like to convert these cloned projects into submodules so that I can better update and control in the future. I've googled a lot on how to do this, but all the tutorials only talk about how to add submodules fresh. Anyone can help me?


Solution

  • Adding existing git repository as a submodule is the same as adding a new one.

    1. First make the folder that contains all your git repositories as itself a git repository with git init.
    2. Use git submodule add https//example.com/remoterepo ./localrepo, where ./localrepo is your existing git repository.
    • Note: You get the URL for remoterepo from localrepo/.git/config.
    1. Repeat the second step for all your existing repositories that you want to add as submodules.
    2. Now you can run git submodule foreach git pull to update all your subprojects.

    You may want to write a small script to automate the second step if you have lots of submodules, which shouldn't be difficult.

    #Edit The following is what I used for trying to reproduce the error mentioned in the comments. I triple checked the commands, and I still can't see the error:

    git --version
    
    mkdir submoduletest
    cd submoduletest
    
    git init --bare remote_repo_A
    git init --bare remote_repo_B 
    
    git clone remote_repo_A local_repo_A
    git clone remote_repo_B local_repo_B
    
    cd local_repo_A
    echo "test commit on repo B" >> test.txt
    git add test.txt
    git commit -m 'test commit message'
    git push origin master
    
    cd ../local_repo_B
    echo "test commit on repo B" >> test.txt
    git add test.txt
    git commit -m 'test commit message'
    git push origin master
    
    cd ../local_repo_A
    git clone ../remote_repo_B local_repo_B
    git submodule add ../remote_repo_B ./local_repo_B
    git submodule foreach git pull origin master
    
    git add .
    git ci -m 'we just added a submodule for remote_repo_B'
    
    git submodule status
    

    Use the following command to check current status of local_repo_A, it has only two blob objects, one for 'test.txt' and another for the implicitly created '.gitmodules' file, nothing from remote_repo_B are added to the index of local_repo_A.

    find .git/objects -type f | awk -F/ '{print $3$4}' | xargs -I {} git cat-file -t {} | grep blob