2014-02-24 76 views
3

也许我不是故意使用git-submodules,但如果有任何其他符合我的情况的git功能,将很高兴找到它。没有分离头的Git子模块?

克隆存储库后,我想子模块在主分支,我永远不会存储厨师启动子模块内的任何额外的文件。

git clone [email protected]:holms/vagrant-starter.git 
git submodule update --init 
cd chef-starter 
git branch 
    * (detached from 0b6a803) 
    master 

我明白,这是一个很好的功能,分别跟踪该子模块目录树,但它不是我的情况。在主版本库克隆之后,我只想将该子模块克隆到最新的主控阶段,而不需要大惊小怪。

我怎样才能做到这一点?

+0

'git clone --recursive URL dir; cd dir; git submodule foreach'git checkout origin/master || :'' –

+0

好的,当你在repo目录上执行git status的时候,你会在执行最后一次签出命令后看到“等待提交”。这是我不想要的。 – holms

回答

7

子模块具有分离头,因为子模块意味着“检查子模块存储库中的特定提交”。 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的子树,而不是子模块:

# 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回购进入chef-starter/目录在vagrant-starter回购。从那时起,如果您选择编辑子树中的文件,则不必做任何特别的事情。例如,克隆后不必运行git submodule update

+0

好吧,它确实适合我的第一个用例。我不必在回购中存储“厨师首发”目录,这很酷。虽然,我想在'vagrant-starter'回购库里面有一个'myrepo'子目录,它有自己的git仓库,对于'vagrant-starter'完全看不见。这可能吗? – holms

+0

我刚刚通过忽略'chef-starter'目录,并在我的生成文件中使用简单的'git clone'而结束了使用。 – holms

1

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

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 
+0

作为更新,我只想提及我更喜欢子树合并作为子模块上的策略天: https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/ – cmaughan

0

使用下列内容:

1)当添加子模块使用-b键设置分支机构:

git submodule add -b master [email protected]:Bla-bla/submodule.git sm_dir 

2)当更新子模块使用--merge参数去合并更新CURRENT子模块的分支(最有可能这将是master):

git submodule update --merge 

这一切