git-subtree:从克隆的repo中推送更改

时间:2012-10-09 14:08:33

标签: git git-subtree

我正在使用git-subtree(来自Avery Pennarun)。在我目前的git repo中,我当然有 我的所有项目文件/文件夹和一个名为“lib”的子树。 如果我现在使用git clone克隆这个git repo,我将获得所有项目文件和 子树“lib”(一切都应该如此)。 我现在尝试的是:我在克隆的子树“lib”中改变了一些东西 repo并尝试使用更改将更改推回到子树“lib”的远程仓库 git subtree push,但它不起作用。问题是什么?我必须添加它吗? 作为子树首先使用git子树添加?

提前谢谢

2 个答案:

答案 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会认为你有两个子树,而文件系统中只有一个子树。

所以我最终得到的解决方案(万一它可以帮助任何人)是:

  1. 创建一个可以推送子树的脚本。称之为publish_<your-subtree-name>
  2. 创建另一个将拉动子树的脚本。称之为update_<your-subtree-name>
  3. 在HEAD上创建一个临时分支并测试更新。如果你的脚本是正确的,你的临时分支就不会移动。
  4. 在其他地方克隆子树仓库,添加一个测试提交,推送它并尝试使用您刚写的更新脚本将其拉入您的仓库。
  5. 如果一切正常,请删除您的临时分支,然后检查两个脚本到超级项目仓库。
  6. 然后,只要您需要推送或拉出子树,请使用脚本。
  7. PS&GT; --squash参数很重要,特别是如果您的reporitories的不同分支拉出子树的不同分支,并且如果您的项目中有多个子树。