Git 子模块开发分支

Git submodules development branches

我是第一次使用 git 个子模块;所以这可能很明显,但我还不知道如何解决。

背景:我正在创建一个公共存储库,以作为多个项目的子模块包含在内。这些项目和子模块有几个开发分支,我希望项目的特定分支指向子模块中的特定分支。我不介意使用脚本设置 CI 来自动执行此操作。 例如,

的分支

项目 A:硕士、A-1、A-2

项目 B:硕士、B-1、B-2

子模块:主模块、A-1、A-2、B-1、B-2

问题:这可能吗?子模块是这种情况的正确选择吗?如果是,我该如何设置?

提前致谢!

有可能,前提是你declaring your submodule with a branch to follow

git submodule add -b <branch> <repository> [<path>]. 

从那里开始,在您的每个项目中,一个简单的 git submodule update --remote 会将子模块的内容从 <repository>/<branch>.

更新到最新的 HEAD

您还可以使用 git subtreegit submodule 添加单个分支的另一种方法)。

关于将子模块的分支添加到不同 repo 的方法

您只需要使用以下命令将子模块仓库的分支添加到主仓库的文件夹中:

git subtree add --prefix=<folder name> <URL for the submodule repo> <branch name>
  • 比如将子模块master分支添加到projectA的master分支,可以使用以下命令:

    # In local project A repo
    git checkout master
    git subtree add --prefix=master <URL for the submodule repo> master
    git push origin master
    
  • 要将子模块 B-1 分支添加到项目 B 的 B-1 分支,您可以使用以下命令:

    # In local project B repo
    git checkout B-1
    git subtree add --prefix=B-1 <URL for the submodule repo> B-1
    git push origin B-1
    

主仓库更新子树的方法:

如果子模块的分支更新了新的更改,您可以通过以下方式更新主仓库中现有的子树:

git subtree pull --prefix=<folder name> <URL for the submodule repo> <branch name>
  • 如子模块B-1分支更新有新变化,可对应更新projectB中的B-1文件夹如下:

    # In local project B repo
    git checkout B-1
    git subtree pull --prefix=B-1 <URL for the submodule repo> B-1
    git push origin B-1
    

关于将更改从主仓库的子树推送到子模块仓库的方法

如果你想直接从主仓库的子树推送更改到子模块仓库,你可以使用命令:

git subtree push --prefix=<folder name> <URL for the submodule repo> <branch name>
  • 比如从ProjectAA-1分支(A-1文件夹)推送变化到子模块repo,可以使用下面的命令:

    # In local project A repo
    git checkout A-1
    # Make the commit changes in the folder A-1
    git subtree push --prefix=A-1 <URL for the submodule repo> A-1
    git push origin A-1