我正在使用git-subtree(来自Avery Pennarun)。在我目前的git repo中,我当然有
我的所有项目文件/文件夹和一个名为“lib”的子树。
如果我现在使用git clone
克隆这个git repo,我将获得所有项目文件和
子树“lib”(一切都应该如此)。
我现在尝试的是:我在克隆的子树“lib”中改变了一些东西
repo并尝试使用更改将更改推回到子树“lib”的远程仓库
git subtree push
,但它不起作用。问题是什么?我必须添加它吗?
作为子树首先使用git子树添加?
提前谢谢
答案 0 :(得分:15)
免责声明,我怀疑在你学习子树之前我只有几天: - )
如果您只是使用git subtree push
,则不会提供足够的子树信息来提取和推送您的更改。
如果你正确地克隆了回购,那么子树就已经存在了。子树需要被告知要推送哪个子树(即使你只有一个),它还需要知道推送到哪里 - 具体来说,你不想推送到顶级仓库。因此,你需要像:
git subtree push --prefix=lib git@github.com:arges-github/lib.git master
显然,应该更改repo和refspec以匹配您的回购。
如果你想查看这里发生的事情(它确实有帮助),子树实际上将影响子树内文件的更改拆分为另一个分支,然后将其推送到子树仓库。要查看这种情况,请使用subtree split
git subtree split --rejoin --branch=shared-changes --prefix=lib
然后看看你做过的分支:
git checkout lib-changes
并手动推送
git push git@github.com:arges-github/lib.git master
如果这不起作用,那么可能是您没有将子树合并到您的仓库中。添加子树时:
git subtree add --squash --prefix lib git@github.com:arges-github/lib.git master
您还需要合并子树并将其推回到顶级仓库。
git subtree pull --squash --prefix lib git@github.com:arges-github/lib.git master
git push
答案 1 :(得分:1)
我遇到了完全相同的问题,我基本上使用Roger Nolan提出的方法解决了这个问题。但是,如果你不像我一样对不区分大小写的文件系统感到不幸,你还必须确保每次执行pull和push时,你的前缀都保持不变。 / p>
当你最终错误地混淆案例时,git会认为你有两个子树,而文件系统中只有一个子树。
所以我最终得到的解决方案(万一它可以帮助任何人)是:
publish_<your-subtree-name>
。update_<your-subtree-name>
。PS&GT; --squash参数很重要,特别是如果您的reporitories的不同分支拉出子树的不同分支,并且如果您的项目中有多个子树。