也许我没有故意使用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
我知道分别跟踪子模块目录树是一个很好的功能,但这不是我的情况。在主存储库克隆之后,我只想将该子模块克隆到最新的主阶段,而不会有任何额外的麻烦。
我怎样才能做到这一点?
答案 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
这就是全部