如何通过子树合并将git存储库与子模块合并到另一个子模块中?

时间:2015-12-05 15:29:21

标签: git merge git-submodules git-subtree pretzo

我有一个dotfiles存储库。我想将另一个与子模块(prezto)合并到其中,这样我可以方便地将所有内容放在一个存储库中,而不会给子模块带来不便。

如何将prezto子树合并到我的dotfiles存储库及其所有子模块?

我可以使用子模块,我可以使用“老式”方式或使用较新的git子树工具拆分和合并子树。

我只是不知道如何处理这个具体案例。

1 个答案:

答案 0 :(得分:2)

Alexander Mikhailian创建了一个script来转换子树中的所有子模块,你应该能够根据你的情况进行调整。

在此处介绍步骤:

cat .gitmodules |while read i
do
  if [[ $i == \[submodule* ]]; then
    mpath=$(echo $i | cut -d\" -f2)
    read i; read i;
    murl=$(echo $i|cut -d\  -f3)
    mcommit=`eval "git submodule status ${mpath} |cut -d\  -f2"`
    mname=$(basename $mpath)
    echo -e "$name\t$mpath\t$murl\t$mcommit"
    git submodule deinit $mpath
    git rm -r --cached $mpath
    rm -rf $mpath
    git remote add $mname $murl
    git fetch $mname
    git branch _$mname $mcommit
    git read-tree --prefix=$mpath/ -u _$mname
fi
done
git rm .gitmodules

我认为最简单的方法是在prezto repo上应用脚本,然后将repo作为dotfiles存储库中的子树。

prezto存储库中执行脚本后,您将使用以下steps创建子树:

  1. 将指向prezto repo的新远程网址添加到dotfiles

    git remote add -f prezto user@example.com:path/prezto.git
    
  2. prezto项目合并到本地dotfiles项目中。这不会在本地更改任何文件,但它确实为下一步准备Git。

    git merge -s ours --no-commit prezto/master
    
  3. 创建一个名为prezto-subdir的新目录(或任何您喜欢的目录),并将prezto项目的Git历史记录复制到其中。

    git read-tree --prefix=prezto-subdir/ -u prezto/master
    
  4. 提交更改以确保安全。

    git commit -m "Subtree merged in prezto"