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

问题描述 投票:0回答:3

我有一个存储库的子文件夹,我正在尝试将其拆分为子树。首先,我按照此过程(https://stackoverflow.com/a/43985326/136785)创建一个仅包含与子文件夹相关的提交(包括重命名)的分支。我确认分支的提交日志看起来符合预期。

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

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 subtree push 会推送不适用于子树的提交?

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

编辑2:我决定放弃git-subtree。我发现了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 git-subtree
3个回答
5
投票

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

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

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


1
投票

git subtree
确实有问题。但是,您可以使用这个补丁使其正常工作,并且速度也会快得多。


0
投票

我在这个问题上挣扎了一段时间(并且在 stackoverflow 上没有看到另一个答案),但意识到我的问题是子树和我的主存储库中的提交历史记录变得混乱。因此,当我只想获取子树时,它会尝试推送整个提交历史记录。对我来说,解决方法基本上是重新设置外部库(在我的例子中称为组件)。这很好,因为无论如何它都固定到外部库(而且我的本地更改相对较小)

这是我使用的通用代码

git rm -r components
rm -rf components
git commit -am "remove components to move to separate repo"
git remote add --fetch components <componit-git-url>
git subtree add --prefix=components/ components master
git commit -am "add your changes back in"
git subtree push --prefix=components/ components my/branch
© www.soinside.com 2019 - 2024. All rights reserved.