4

我一直在尝试远离子模块以获得一个独立的存储库,并且子树合并策略似乎与这个用例相匹配。

然而,合并后的 repos 历史出现在我自己的项目历史中,这很烦人。

我已经尝试过git filter-branch --subdirectory-filter path/to/subtree/ HEAD哪个有效......直到我尝试更新一个子树,git pull -s subtree my-subtree master它将所有子树的文件重写到我的项目的根目录。

有没有办法在 git 中实现这一点?

4

2 回答 2

9

apenwarrgit 子树有一个--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 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"
于 2010-09-18T10:53:29.727 回答
0

如果只是在阅读“git log”时感到烦恼,那么您可能想尝试:

git log --first-parent

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

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

git log -p -m --first-parent

不需要额外的工具:)

于 2010-12-20T09:55:56.137 回答