2012-10-09 45 views
8

我正在使用git-subtree(来自Avery Pennarun)。在我目前的git repo中,我当然有 我所有的项目文件/文件夹和一个名为“lib”的子树。 如果我现在使用git clone克隆这个git repo,我得到了所有的项目文件和 子树“lib”(应该是它的一切)。 我现在尝试的:我在克隆的 repo中的子树“lib”中更改了某些内容,并试图使用 git subtree push将更改推回到子树“lib”的远程回购,但它没有奏效。问题是什么?我必须添加它 作为子树第一次与git子树添加?git-subtree:推送来自克隆回购的更改

THX提前

+0

您是如何将子树添加到顶级项目的?你只是建立一个目录并克隆进它? –

+0

嗨!我使用“git subtree add”将子树添加到我的顶级项目中。也许我的问题还不够清楚:如果我在其他机器上克隆回购,那么我将所有项目文件加上子树“lib”。现在我在克隆的repo中的子树“lib”中更改了一些内容,我无法使用“git subtree push”将更改推回到远程服务器,这是我的问题。 – arge

+0

答案有帮助吗? –

回答

14

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

如果你只是使用git subtree push你不给子树足够的信息来提取和推动你的改变。

如果您正确地克隆了回购,子树已经在那里。需要知道子树需要从哪个子树中推出(即使只有一个子树),并且还需要知道应该推到哪里 - 具体而言,您不希望推向顶层回购。因此,你想要的东西是这样的:

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

显然repo和refspec应该改变,以符合你的回购。

如果你想看看这里发生了什么(它确实有帮助),子树实际上会将影响子树内文件的更改分解到不同的分支,然后将其推送到子树回购。看到这样的情况,使用subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

然后看看你所做的分支:

git checkout lib-changes 

和手动把他们

git push [email protected]:arges-github/lib.git master 

如果不是那么可能是因为您没有将子树合并到您的回购库中。当您添加子树时:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

您还需要合并子树并将其推回到您的顶级回购。

git subtree pull --squash --prefix lib [email protected]:arges-github/lib.git master 
git push 
+0

我已经执行了步骤,直到“添加”。没有找到任何文件表明后续的“拉”是必需的。如果在“add”之后的子树上没有完成初始第一次“拉”,会发生什么情况?我面临的问题是,即使在使用--squash“添加”后,当我尝试“子树推送”时,它会开始检查自该时间开始以来该子树上的所有提交,即使我希望它只推送那些提交在子树被“添加”回到容器回购之后。 – Nishith

1

我有完全相同你有同样的问题,我解决它基本上使用方法罗杰·诺兰建议。但是,如果您不幸像我一样使用不区分大小写的文件系统,则还必须确保每次执行pull和push操作时,前缀的大小写都保持不变。

当你最终混淆错误的情况下,混帐会认为你有两个子树,而只有一个将存在于文件系统。

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

  1. 创建一个脚本,将推动你的子树。叫它publish_<your-subtree-name>
  2. 创建另一个脚本来拉你的子树。叫它update_<your-subtree-name>
  3. 在HEAD上创建临时分支并测试更新。如果你的脚本是正确的,你的临时分支将不会移动。
  4. 在其他地方克隆子树回购,添加一个测试提交,推送它,并尝试使用刚刚写入的更新脚本将其存入您的回购站。
  5. 如果一切正常,请删除您的临时分支,然后将两个脚本都签入到超级项目回购中。
  6. 然后,无论何时您需要推或拉子树,请使用脚本。

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