14

我刚刚发现了 git-subtree 工具,该工具前段时间成为主要 git repo 的一部分 https://github.com/apenwarr/git-subtree/

但是我不完全理解这个工具在现有的“git read-tree”+“git merge -s subtree”上提供了什么功能。git-subtree 的唯一目的是让生成的提交历史看起来更好,还是它有更多我忽略的功能?

4

3 回答 3

12

您描述的命令将子树读入存储库。如文档所述,该git-subtree命令有更多选项。除其他外,您可以(为简单起见进行注释):

add::
    Create the <prefix> subtree by importing its contents
    from the given <refspec> or <repository> and remote <refspec>.
merge::
    Merge recent changes up to <commit> into the <prefix>
    subtree.
pull::
    Exactly like 'merge', but parallels 'git pull' in that
    it fetches the given commit from the specified remote
    repository.
push::
    Does a 'split' (see above) using the <prefix> supplied
    and then does a 'git push' to push the result to the 
    repository and refspec. This can be used to push your
    subtree to different branches of the remote repository.
split::
    Extract a new, synthetic project history from the
    history of the <prefix> subtree.  The new history
    includes only the commits (including merges) that
    affected <prefix>, and each of those commits now has the
    contents of <prefix> at the root of the project instead
    of in a subdirectory.  Thus, the newly created history
    is suitable for export as a separate git repository.

还有各种标志可以帮助和操纵上述内容。我相信所有这些选项之前都可以通过管道命令链获得。git-subtree.sh只是包装它们并使它们更容易执行。

于 2012-07-31T14:24:16.453 回答
5

如果您在将旧子树代码作为 contrib 模块添加到 git 之前查看它:https ://github.com/apenwarr/git-subtree/blob/master/git-subtree.sh您可以看到 git subtree 工具实际上是围绕较低级别的 git 子树合并策略的更高级的包装器。

它基本上以一种明智的方式利用这些策略来简化子树管理。特别是 --squash 的东西真的非常有用。

于 2013-06-19T16:23:16.287 回答
0

除了有更多的选择之外,git subtree还兼顾了 Git 的配置。

但是关于git subtree pull,请确保使用 Git 2.36+

git subtree想要创建合并时,它使用了“ git mergeman并让它受最终用户“ merge.ff”配置的影响,这已在 Git 2.36(2022 年第二季度)中更正。

请参阅Thomas Koutcher ( ) 的提交 9158a35(2022 年 2 月 1 日(由Junio C Hamano 合并 -- --0ac270c 提交中,2022 年 2 月 17 日)koutcher
gitster

subtree: 强制合并提交

签字人:Thomas Koutcher
审核人:Johannes Altmanninger

merge.ff设置为onlyin 时.gitconfiggit subtree pull将失败并出现错误

fatal: Not possible to fast-forward, aborting. 

但是该命令确实想在这些地方进行合并。

向( man )添加--no-ff参数以强制执行此行为。git merge

于 2022-02-20T10:29:10.837 回答