代码之家  ›  专栏  ›  技术社区  ›  julien

Git子树合并策略,是否可以不合并历史记录?

  •  4
  • julien  · 技术社区  · 14 年前

    为了得到一个独立的存储库,我一直在尝试从子模块中移开,并且 subtree merge strategy 似乎与此用例匹配。

    然而,合并后的回购协议的历史出现在我自己项目的历史中,这让我很恼火。

    我试过了 git filter-branch --subdirectory-filter path/to/subtree/ HEAD 这工作…直到我尝试用更新子树 git pull -s subtree my-subtree master 它将所有子树的文件重写为我的项目的根目录。

    有没有办法在Git本地实现这一点?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Community Michael Schmitz    7 年前

    apenwarr 艾斯 git 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子树 在它生成的提交消息中记录额外的信息;这些额外的信息允许它有效地进行合并,而不必合并正在合并的子树的实际历史记录。


    如果您知道永远不会对__super_存储库中的子树进行任何更改(即,子树中的所有更改始终来自其他存储库),那么您可以不使用 Git子树 再重复一遍 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"
    
        2
  •  0
  •   hopla    14 年前

    如果在读取“git log”时只是一个麻烦,那么您可能需要尝试:

    git log --first-parent
    

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

    如果您希望看到它带有diff(这将为合并提交创建一个大diff):

    git log -p -m --first-parent
    

    不需要额外的工具:)