我使用Git树(来自Avery Pennarun)。 在我目前的git回购我当然我所有的项目文件/文件夹和一个名为“LIB”子树。 如果我现在用克隆这个混帐回购协议git clone
我得到的所有项目文件和子树“LIB”(一切都因为它应该是)的。 我现在尝试:我在克隆回购子树“LIB”内改变的东西,并试图推动修改回子树“LIB”使用远程回购git subtree push
,但没有奏效。 问题是什么? 我必须将其添加为子树先用git的子树补充的吗?
Thx提前
我使用Git树(来自Avery Pennarun)。 在我目前的git回购我当然我所有的项目文件/文件夹和一个名为“LIB”子树。 如果我现在用克隆这个混帐回购协议git clone
我得到的所有项目文件和子树“LIB”(一切都因为它应该是)的。 我现在尝试:我在克隆回购子树“LIB”内改变的东西,并试图推动修改回子树“LIB”使用远程回购git subtree push
,但没有奏效。 问题是什么? 我必须将其添加为子树先用git的子树补充的吗?
Thx提前
免责声明,我怀疑我在你前面只有几天性学习的有关子树:-)
如果你只是使用git subtree push
你不给子树足够的信息来提取和推送更改。
如果您克隆回购正确的子树将已经在那里。 子树需要被告知要从推动(即使你只有一个),该子树,它也需要知道在哪里推 - 特别是你不想推到顶级回购。 因此,你想是这样的:
git subtree push --prefix=lib git@github.com:arges-github/lib.git master
显然,回购和的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
我正好有你有同样的问题,我解决它基本上使用方法罗杰·诺兰建议。 但是,如果你不幸是不区分大小写的文件系统上,好像我是,你还必须确保每个你做一个拉和推的时候,你的前缀的情况保持不变。
当你结束了错误的情况下混合起来,git会认为你有两个子树,而只有一个会在文件系统中存在。
所以,我结束了(如果它可以帮助任何人)的解决方案是:
publish_<your-subtree-name>
。 update_<your-subtree-name>
。 PS>的--squash参数是很重要的,特别是如果你的reporsitories的不同分支拉子树的不同分支,也如果你在你的项目中多个子树。