Git子树合并策略,是否可以在不合并历史记录的情况下实现?

4

我一直试图摆脱子模块以获得一个独立的存储库,而子树合并策略似乎符合这个使用案例。

然而,合并的存储库历史出现在我的项目历史中,这相当让人烦恼。

我尝试了git filter-branch --subdirectory-filter path/to/subtree/ HEAD,它有效...,但是当我尝试使用git pull -s subtree my-subtree master更新子树时,它会将所有子树文件重写到我的项目根目录下。

有没有一种方法可以在Git中原生实现此操作?

2个回答

9

apenwarrgit subtree有一个--squash选项,它可能几乎可以做到你想要的。

remote=libfoo
branch=master
prefix=helpers/libfoo

git fetch "$remote" &&
git subtree add --prefix="$prefix" --squash "$remote/$branch"

: Later, once there are changes to pick up.
git subtree pull --prefix="$prefix" --squash "$remote" "$branch"
< p > Git subtree 在生成的提交消息中记录额外信息;这些额外信息使其能够有效地进行合并,而无需合并被合并的子树的实际历史记录。


如果您知道您永远不会对“超级”存储库中的子树进行任何更改(即子树中的所有更改始终来自其他存储库),那么您可以不使用git subtree,只需重复子树合并方法中的git read-tree --prefix=部分(但您必须首先从索引中清除当前子树)。
remote=libfoo
branch=master
prefix=helpers/libfoo/

: replace the local subtree with whatever the other repository has
git fetch "$remote" &&
git rm -r --ignore-unmatch "$prefix" &&
git read-tree --prefix="$prefix" "${remote}/${branch}" &&
git checkout -- "$prefix" &&
git commit -m "update $prefix from $remote $branch"

我希望能够在不依赖于依赖关系的情况下维护子树的本地分支,似乎在这里不能两全其美...不过我会让这个问题保持开放状态几天,以防有人想出使用git实现这一点的神奇方法。谢谢Chris。 - julien

0
如果在阅读“git log”时只是一种烦恼,那么您可以尝试:
git log --first-parent

它只显示您的提交和(单个)合并提交,但不显示远程提交。

如果您想使用差异查看它(这将为合并提交创建一个大差异):

git log -p -m --first-parent

无需额外工具 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接