-->

git的子树:按从克隆回购的变化(git-subtree: Push changes from an

2019-08-01 06:30发布

我使用Git树(来自Avery Pennarun)。 在我目前的git回购我当然我所有的项目文件/文件夹和一个名为“LIB”子树。 如果我现在用克隆这个混帐回购协议git clone我得到的所有项目文件和子树“LIB”(一切都因为它应该是)的。 我现在尝试:我在克隆回购子树“LIB”内改变的东西,并试图推动修改回子树“LIB”使用远程回购git subtree push ,但没有奏效。 问题是什么? 我必须将其添加为子树先用git的子树补充的吗?

Thx提前

Answer 1:

免责声明,我怀疑我在你前面只有几天性学习的有关子树:-)

如果你只是使用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


Answer 2:

我正好有你有同样的问题,我解决它基本上使用方法罗杰·诺兰建议。 但是,如果你不幸是不区分大小写的文件系统上,好像我是,你还必须确保每个你做一个拉和推的时候,你的前缀的情况保持不变。

当你结束了错误的情况下混合起来,git会认为你有两个子树,而只有一个会在文件系统中存在。

所以,我结束了(如果它可以帮助任何人)的解决方案是:

  1. 创建一个脚本,将推动你的子树。 说它publish_<your-subtree-name>
  2. 创建另一个脚本,将拉你的子树。 说它update_<your-subtree-name>
  3. 创建你的头一个临时党支部,并测试了更新。 如果你的脚本是正确的,您的临时分支不会移动。
  4. 克隆子树回购其他地方,添加在测试提交,推,然后尝试将其拉入使用你刚刚编写的脚本更新您的回购协议。
  5. 如果所有的作品,删除临时党支部,现在在这两个脚本的超级项目回购检查。
  6. 然后,当你需要推或拉子树,使用脚本。

PS>的--squash参数是很重要的,特别是如果你的reporsitories的不同分支拉子树的不同分支,也如果你在你的项目中多个子树。



文章来源: git-subtree: Push changes from an cloned repo