git将子目录推送到另一个主仓库

时间:2011-08-10 12:57:08

标签: git git-push git-subtree

我有一个很大的主项目,有几个目录为子树

我希望一个特定子树中的更改推送到其原点,这是一个单独的存储库。

麻烦似乎是,我想要推送的当前子树最初并非来自我想要推送的存储库。它来自一个不同的回购,通过谷歌搜索找到的子树指南。它看起来非常相似。

大项目布局,其中important_subtree是我担心的事情。

~/devel/bigproject
  .git/
  some_subtree/
  other_subtree/
  important_subtree/
    abc.txt
    efg.txt   <--- new version
    hij.txt

important_subtree与该回购“强烈相关”:

~/devel/important
   .git/
    abc.txt
    efg.txt   <--- old version
    hij.txt

现在~/devel/bigproject/important_subtree/efg.txt已更改,我想将important_subtree 推送到回购~/devel/important。所以事后~/devel/important/efg.txt也有变化。

我唯一能做的就是将 bigproject 中的所有推送到重要中,这显然不是我想要的。只应推送子树中的更改。

3 个答案:

答案 0 :(得分:3)

我建议将git-subtree添加到git中。它添加了git subtree split命令,可以执行您想要的操作。

git subtree split --prefix=important_subtree --branch=backport <subtree merge SHA1>^.. --onto=<imported SHA1> --rejoin
git push ~/devel/important backport:master

由于您将bigproject合并为一个子树,因此仅选择那些已修改important的子树,因此选择important_subtree/中的更改。然后,它将它们作为新提交应用于您从~/devel/important导入的提交之上,并创建一个分支backport,您可以按正常方式向后推送。另外--rejoin使得如果您想要在更多更改上重复该过程,将来不需要使用提交ID。

author's blog post还有更多解释。

答案 1 :(得分:3)

这已不再那么复杂了,您可以在repo的克隆上使用git filter-branch命令来剔除您不想要的子目录,然后推送到新的遥控器。

git clone <ORIG_REPO_DIR> <NEW_REPO_DIR>
cd <NEW_REPO_DIR>
git filter-branch --prune-empty --subdirectory-filter <THE_SUBDIR_TO_MAKE_NEW_ROOTDIR> master
git push <MY_NEW_REMOTE_ORIGIN_URL> -f .

答案 2 :(得分:1)

推进不同的分支可能是一个非常棘手的事情。

也许最简单的方法是:

  1. 再次从服务器克隆您的“重要”回购邮件。
  2. 在您的“bigproject”中生成补丁,其中包含您想要的更改 首先推送(例如git format-patch)(如果你的原始提交混合应该被推送的文件和不应该这样的文件,你可能需要先在一个侧分支中进行“较小”的提交)
  3. 在新的“重要”克隆中应用补丁(git am)
  4. 将“important”的新克隆推送到其默认远程主控。现在推动只是一个简单的快进,不应该造成麻烦。