我刚刚发现了 git-subtree 工具,该工具前段时间成为主要 git repo 的一部分 https://github.com/apenwarr/git-subtree/
但是我不完全理解这个工具在现有的“git read-tree”+“git merge -s subtree”上提供了什么功能。git-subtree 的唯一目的是让生成的提交历史看起来更好,还是它有更多我忽略的功能?
我刚刚发现了 git-subtree 工具,该工具前段时间成为主要 git repo 的一部分 https://github.com/apenwarr/git-subtree/
但是我不完全理解这个工具在现有的“git read-tree”+“git merge -s subtree”上提供了什么功能。git-subtree 的唯一目的是让生成的提交历史看起来更好,还是它有更多我忽略的功能?
您描述的命令将子树读入存储库。如文档所述,该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
只是包装它们并使它们更容易执行。
如果您在将旧子树代码作为 contrib 模块添加到 git 之前查看它:https ://github.com/apenwarr/git-subtree/blob/master/git-subtree.sh您可以看到 git subtree 工具实际上是围绕较低级别的 git 子树合并策略的更高级的包装器。
它基本上以一种明智的方式利用这些策略来简化子树管理。特别是 --squash 的东西真的非常有用。
除了有更多的选择之外,git subtree
还兼顾了 Git 的配置。
但是关于git subtree pull
,请确保使用 Git 2.36+
当git subtree
想要创建合并时,它使用了“ git merge
” (man)并让它受最终用户“ 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
设置为only
in 时.gitconfig
,git subtree pull
将失败并出现错误fatal: Not possible to fast-forward, aborting.
但是该命令确实想在这些地方进行合并。