How can I specify a branch/tag when adding a Git submodule?

前端 未结 12 1244
旧巷少年郎
旧巷少年郎 2020-11-21 06:39

How does git submodule add -b work?

After adding a submodule with a specific branch, a new cloned repository (after git submodule update --init

12条回答
  •  粉色の甜心
    2020-11-21 07:04

    I'd like to add an answer here that is really just a conglomerate of other answers, but I think it may be more complete.

    You know you have a Git submodule when you have these two things.

    1. Your .gitmodules has an entry like so:

      [submodule "SubmoduleTestRepo"]
          path = SubmoduleTestRepo
          url = https://github.com/jzaccone/SubmoduleTestRepo.git
      
    2. You have a submodule object (named SubmoduleTestRepo in this example) in your Git repository. GitHub shows these as "submodule" objects. Or do git submodule status from a command line. Git submodule objects are special kinds of Git objects, and they hold the SHA information for a specific commit.

      Whenever you do a git submodule update, it will populate your submodule with content from the commit. It knows where to find the commit because of the information in the .gitmodules.

      Now, all the -b does is add one line in your .gitmodules file. So following the same example, it would look like this:

      [submodule "SubmoduleTestRepo"]
          path = SubmoduleTestRepo
          url = https://github.com/jzaccone/SubmoduleTestRepo.git
          branch = master
      

      Note: only branch name is supported in a .gitmodules file, but SHA and TAG are not supported! (instead of that, the branch's commit of each module can be tracked and updated using "git add .", for example like git add ./SubmoduleTestRepo, and you do not need to change the .gitmodules file each time)

      The submodule object is still pointing at a specific commit. The only thing that the -b option buys you is the ability to add a --remote flag to your update as per Vogella's answer:

      git submodule update --remote
      

      Instead of populating the content of the submodule to the commit pointed to by the submodule, it replaces that commit with the latest commit on the master branch, THEN it populates the submodule with that commit. This can be done in two steps by djacobs7 answer. Since you have now updated the commit the submodule object is pointing to, you have to commit the changed submodule object into your Git repository.

      git submodule add -b is not some magically way to keep everything up to date with a branch. It is simply adds information about a branch in the .gitmodules file and gives you the option to update the submodule object to the latest commit of a specified branch before populating it.

提交回复
热议问题