git - Git的子模块指定一个分支/ 标记

如何执行 git submodule add -b

在添加带有特定分支的子模块之后,新的克隆repo ( git submodule update --init)将处于特定的提交状态,而不是分支本身(子模块上的git status显示" Not currently on any branch")上。

我找不到关于.gitmodules或.git/config的分支或特定提交信息,如何解决?

谢谢!

PS :我正在使用1.6.5.2

时间:

注意:Git 1.8.2增加了跟踪分支的可能性,


如果要将子模块移动到特定标记,请执行以下操作:


cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m"moved submodule to v1.0"
git push

然后,想要将submodule_directory更改为该标签的开发人员执行这个操作,


git pull
git submodule update

git pull将子模块目录指向更改,实际上git submodule update合并了新代码。

Git 1.8.2增加了跟踪分支的可能性。


# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

另请参阅git子模块

我想在这里添加一个答案,它实际上是其他答案的混合体,但我认为它可能更完整。

当你有这两个东西的时候你知道你有一个git模块。

1 ) 。gitmodule有一个类似这样的条目:


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

2 ) 你的git仓库中有一个模块对象( 这里示例中名为 SubmoduleTestRepo ) 。 Github 将这些内容显示为"子模块"对象。 在一个或者做 Git模块对象是特殊类型的Git对象,它们为特定提交持有SHA信息。

每当你做一个git子模块更新时,它都会用提交的内容填充你的子模块。 由于中的信息,它知道在哪里查找提交。

现在,所有-b在你的。gitmodule文件中添加一行。 因此,遵循相同的示例,它将如下所示:


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

子模块对象仍指向特定的提交。 唯一的事情,以至于-b选项购买你是能够添加一个 vogella: --remote标志给厂你的更新答案。


git submodule update --remote

它不是将子模块的内容填充到子模块的提交中,而是用主分支上的最近提交替换该提交,然后使用该提交填充子模块。 这可以通过djacobs7回答两个步骤完成。 既然你已经更新了提交的子模块对象,你必须将已经更改的子模块对象提交到你的git知识库。

按照 branch, git子模块添加-b不是那些奇迹般地方法去保持一切直至吸烟日期 它只是在。gitmodule文件中添加关于分支的信息,并让你选择将子模块对象更新为指定分支的最新提交,然后再填充它。

如何使用git模块的例子。

  1. 创建新的repo
  2. 然后克隆另一个repo作为子模块
  3. 然后使用一个叫做V3.1.2的标记
  4. 然后提交

看起来像这样:


git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status

在我的经验中,在superproject或者未来的签出中切换分支仍然会导致子模块的分离,而不管子模块是否被正确添加和跟踪( 例如 。 @djacobs7 和 @Johnny Z 回答。

而不是手工地手动签出正确的分支或者通过脚本模块来使用。

这将检查分支属性的子模块配置文件,并检查设置分支。

git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'

我的.gitconfig文件中这样做的,它仍然是一个草稿,但是现在已经证明是有用的,它帮助我把子模块重新连接到它们的分支。


[alias]

######################
#
#Submodules aliases
#
######################


#git sm-trackbranch : places all submodules on their respective branch specified in .gitmodules
#This works if submodules are configured to track a branch, i.e if .gitmodules looks like :
#[submodule"my-submodule"]
# path = my-submodule
# url = git@wherever.you.like/my-submodule.git
# branch = my-branch
sm-trackbranch ="! git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git checkout $branch'"

#sm-pullrebase :
# - pull --rebase on the master repo
# - sm-trackbranch on every submodule
# - pull --rebase on each submodule
#
# Important note :
#- have a clean master repo and subrepos before doing this !
#- this is *not* equivalent to getting the last committed 
# master repo + its submodules: if some submodules are tracking branches 
# that have evolved since the last commit in the master repo,
# they will be using those more recent commits !
#
# (Note : On the contrary, git submodule update will stick 
#to the last committed SHA1 in the master repo)
#
sm-pullrebase ="! git pull --rebase; git submodule update; git sm-trackbranch ; git submodule foreach 'git pull --rebase'"

# git sm-diff will diff the master repo *and* its submodules
sm-diff ="! git diff && git submodule foreach 'git diff'"

#git sm-push will ask to push also submodules
sm-push = push --recurse-submodules=on-demand

#git alias : list all aliases
#useful in order to learn git syntax
alias ="!git config -l | grep alias | cut -c 7-"

...