Git子树合并策略,可能没有合并历史?

时间:2010-09-17 22:05:03

标签: git history git-submodules subtree

我一直试图摆脱子模块以获得一个自包含的存储库,而subtree merge strategy似乎与这个用例匹配。

然而,合并后的回购'历史出现在我自己的项目历史中,这令人讨厌。

我尝试了git filter-branch --subdirectory-filter path/to/subtree/ HEAD,直到我尝试使用git pull -s subtree my-subtree master更新子树,然后将所有子树的文件重写为项目的根目录。

有没有办法在git中本地实现这个?

2 个答案:

答案 0 :(得分:8)

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" 选项,可能几乎与您想要的一样。

git read-tree --prefix=

git subtree 在其生成的提交的提交消息中记录额外信息;这些额外的信息允许它有效地进行合并,而不必合并被合并的子树的实际历史。


如果您知道永远不会对“超级”存储库中的子树进行任何更改(即子树中的所有更改将始终来自其他存储库),那么您可以不使用 git subtree < / em>并且只重复子树合并方法的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" 部分(尽管你必须先从索引中清除当前的子树)。

{{1}}

答案 1 :(得分:0)

如果在阅读'git log'时只是一个烦恼,那么你可能想尝试:

git log --first-parent

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

如果你想用diff看到它(这会为合并提交创建一个很大的差异):

git log -p -m --first-parent

无需额外工具:)