Git 子树推送似乎推送不适用于子树的提交?

Git subtree push seems to push commits that don't apply to the subtree?

我有一个要拆分为子树的存储库的子文件夹。首先,我按照此过程 () 创建了一个仅包含与子文件夹相关的提交(包括重命名)的分支。我确认分支的提交日志看起来符合预期。

接下来,我为该子项目创建一个新的存储库:

git init --bare \nas\git\FPF.git
git push ssh://myserver.com/~/FPF.git branch-fpf:master 

然后我从父存储库中删除子文件夹并将其重新添加为子树:

git rm -r htdocs/wp-content/plugins/fpf
git add -A
git commit -am "Removing folder to re-add as subtree"
git remote add fpf ssh://myserver.com/~/FPF.git
git subtree add --prefix=htdocs/wp-content/plugins/fpf fpf master --squash

现在作为快速完整性检查,我将获取远程子树存储库的副本(当然在另一个文件夹中):

git clone ssh://myserver.com/~/FPF.git

并且:

git subtree push --prefix=htdocs/wp-content/plugins/fpf fpf master

因为我在添加子树和推送之间没有提交任何更改,所以我希望不会推送任何新内容。但事实证明,如果我再次克隆 FPF.git,我发现它现在有大量额外的提交 - FPF 已经增长了很多倍,提交日志现在反映了许多仅适用于文件的提交在子树之外。

为什么 git 子树推送 推送不适用于子树的提交?

编辑 1: 额外的提交是来自主(父)repo 的所有提交,在第一次 FPF 提交之前开始并回到时间的开始。换句话说:如果我在执行 git 子树推送之前和之后比较 FPF 子树存储库的日志,它们是相同的,直到我到达 "pre-push" 克隆日志的底部。从那里,"post-push" 克隆的日志一直持续到父项目的第一次提交。 Git 子树推送有效地附加了父项的完整先前历史记录。

编辑 2: 我决定放弃 git-子树。我发现 https://github.com/ingydotnet/git-subrepo,它不仅工作正常,而且解决了子树的一些缺点(最明显的是非常慢的推送)。将这个问题留在这里以防其他人想出答案或正在为同样的问题而苦苦挣扎,但为了简化一点,这里有一个完整的从开始到结束的命令集来展示问题。与上面的区别:这不是从多个过滤分支嫁接而成的分支开始的;它只是做单个子树分裂的最简单情况:

cd MainProjectRepo
git subtree split --prefix=htdocs/wp-content/plugins/fpf --branch=branch-new
git init --bare \nas\git\FPF.git
git remote add fpf ssh://myserver.com/~/FPF.git
git push fpf branch-new:master
git rm -r htdocs/wp-content/plugins/fpf
git add -A
git commit -am "Removing folder to re-add as subtree"
git subtree add --prefix=htdocs/wp-content/plugins/fpf fpf master --squash

git clone ssh://myserver.com/~/FPF.git /tmp/fpf1
git subtree push --prefix=htdocs/wp-content/plugins/fpf fpf master
git clone ssh://myserver.com/~/FPF.git /tmp/fpf2

如上所述,fpf2 以来自源代码库的完整提交历史结束。

对于可能遇到此问题的其他人:

我的结论是,经过许多小时的努力(阅读、讨论、以不同方式重试等),git-subtree 无法正常工作。相反,我发现了一个更好的选择:git-subrepo。它不仅可以正常工作,而且解决了子树的许多其他缺点 - 最显着的是非常慢的推送。

因此我的“答案”是如何解决这个问题:放弃 git-subtree 并改用 git-subrepo :)

git subtree 确实有问题。但是,您可以使用 this patch 使其正常工作,并且速度也会更快。