没有分离头的Git子模块?

时间:2014-02-24 06:05:09

标签: git git-submodules

也许我没有故意使用git-submodules,但是如果有任何其他git功能可以满足我的情况,那么很高兴找到它。

克隆存储库之后,我希望子模块位于master分支中,我永远不会在chef-starter子模块中存储任何其他文件。

git clone git@github.com:holms/vagrant-starter.git
git submodule update --init
cd chef-starter
git branch
   * (detached from 0b6a803)
   master

我知道分别跟踪子模块目录树是一个很好的功能,但这不是我的情况。在主存储库克隆之后,我只想将该子模块克隆到最新的主阶段,而不会有任何额外的麻烦。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:8)

子模块具有分离的头部,因为子模块意味着“从子模块的存储库中检出特定的提交”。 master分支可能已向前移动(它可能指向从提交0b6a803下降的提交),因此Git会检出特定的修订而不是检出分支。

git-submodule可以选择记录分支名称。执行此操作时,可以使用git submodule update --remote更新具有该分支的子模块:

# Add the submodule with the "master" branch referenced
git submodule add -b master https://github.com/holms/chef-starter.git chef-starter

# When you want to update the submodule:
git submodule update --remote

# You'll still need to commit the submodule if you want future checkouts to use the new revision
git add chef-starter
git commit -m "Update chef-starter submodule"

当你开始检查超级项目的不同版本(vagarant-starter)时,你仍会在子模块中得到一个分离的头,但至少现在更容易从远程更新子模块到最新版本

您可能会发现使用git-subtree而不是子模块更容易:

# First, get rid of the submodule
git submodule deinit chef-starter # If you have Git 1.8.3 or later, otherwise edit .gitmodules
git rm chef-starter               # Remove the directory
git commit -m "Removed chef-starter submodule in preparation to add as a subtree"

# Now add the subtree
git subtree add -P chef-starter https://github.com/holms/chef-starter master --squash

这会将chef-starter个repo移植到chef-starter/个回购中的vagrant-starter目录中。从那时起,如果您选择编辑子树中的文件,则不必执行任何特殊操作。例如,您无需在克隆后运行git submodule update

答案 1 :(得分:3)

为了确保我的子模块保持同步和未分离,我在批处理文件中有以下内容。它依赖于采用同步到子模块主分支的策略 - 对我来说这不是问题,我只是分叉子模块并确保它有一个主模块。我发现用这种方法跟踪事情要容易得多。

git pull
git submodule sync    # Ensure the submodule points to the right place
git submodule update  # Update the submodule  
git submodule foreach git checkout master  # Ensure subs are on master branch
git submodule foreach git pull origin master # Pull the latest master

答案 2 :(得分:1)

使用以下内容:

1)添加子模块时使用-b键设置其分支:

git submodule add -b master git@github.com:Bla-bla/submodule.git sm_dir

2)更新子模块时,使用--merge param将更新合并到CURRENT子模块的分支(很可能是master):

git submodule update --merge

这就是全部