2017-02-20 30 views
1

假如我是上犯了具有子模块S1的Git获取最新从子模块gitmodule

,有人添加子模块S2在犯下+ 1,现在我不想要移动到一个+ 1,但取(只下载)子模块s2。

这可能吗?

我的Git版本2.1.4是我可以在必要时更新

编辑得到2.10.1.windows.1:简单的脚本我试过了,它有一些问题 - 新里git的文件夹被克隆子模块而不是超级代表的.git /模块文件夹 - 工作目录受到新子模块的污染:

git diff HEAD origin/master .gitmodules 2>&1 | perl -e ' 
while(<>) 
{ 
    if(/^\+\s+path = (.+)/) 
    { 
     my $path = $1; 
     my $line = <>; 
     if($line=~/^\+\s+url = (.+)/) 
     { 
     my $url = $1; 
     print "$path -> $url\n"; 
     `git clone "$url" "$path"` 
     } 
    } 
}' 

回答

0

这可能吗?

不完全:您可以show the content of the latest .gitmodule file

git fetch 
git show origin/master:./.gitmodules 

这会给你的第二子模块S2的网址,而不是它的SHA1。

如果这就够了,你可以在你自己的repo(嵌套的git repo)中克隆它。


如果你可以升级到latest Git for Windows(2.11或快2.12),我会用git worktree command

  • 结账a+1承诺在一个单独的worktree(与所述git worktree命令),并运行在该独立工作树中的git submodule update --init
  • (从您自己当前的回购仍在提交'a')到s2的符号链接,该链接在右侧正确签出SHA1

这样,您不会移动当前的回购,但仍可从a+1的实际子模块内容s2中受益。

+0

所以这是一个简单的脚本,我为你的第一个方法做了,这里有什么不对吗?因为当我克隆s2时,submodule的'.git'文件夹位于子模块内,而不在超级存储库的'.git/modules'中。编辑:将脚本置于问题中,因为我无法在此处格式化 – tejas

+0

@tejas不打扰第一种方法:它不知道要检出哪个S2的确切版本。使用git worktree做2d方法:它允许你有多个工作树,这意味着你的当前工作树将不会被触及(除了符号链接,它也存在于Windows中,并带有一个简单的结点:'mklink/J' ) – VonC

+0

我真的不需要签出s2,只是试图保存下载时间,当实际检查/子模块更新 – tejas