kis*_*rgy 10 git merge git-submodules git-subtree pretzo
我有一个dotfiles存储库.我想将另一个与子模块(prezto)合并到其中,因此我可以方便地将所有内容放在一个存储库中,而不会出现子模块的不便.
我怎样才能将prezto与其所有子模块合并到我的dotfiles存储库中?
我可以使用子模块,我可以使用"老式"方式或使用较新的git子树工具拆分和合并子树.
我只是不知道如何做这个具体案例.
Alexander Mikhailian 创建了一个脚本来转换子树中的所有子模块,您应该能够根据您的情况调整它。
在此介绍步骤:
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
Run Code Online (Sandbox Code Playgroud)
我认为对您来说最简单的方法是在prezto存储库上应用脚本,然后使存储库成为dotfiles存储库中的子树。
在存储库中执行脚本后,prezto您将使用以下步骤来创建子树:
prezto将指向存储库的新远程 URL 添加到dotfiles.
git remote add -f prezto user@example.com:path/prezto.git
Run Code Online (Sandbox Code Playgroud)将项目合并prezto到本地dotfiles项目中。这不会在本地更改任何文件,但会为下一步准备 Git。
git merge -s ours --no-commit prezto/master
Run Code Online (Sandbox Code Playgroud)创建一个名为prezto-subdir(或任何您喜欢的名称)的新目录,并将项目的 Git 历史记录复制prezto到其中。
git read-tree --prefix=prezto-subdir/ -u prezto/master
Run Code Online (Sandbox Code Playgroud)提交更改以确保它们的安全。
git commit -m "Subtree merged in prezto"
Run Code Online (Sandbox Code Playgroud)