5

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

我想将一个特定子树中的更改送到它的原点,这是一个单独的存储库。

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

大项目布局,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推到 repo 上~/devel/important。所以之后~/devel/important/efg.txt也有变化。

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

4

3 回答 3

4

这不再那么复杂,您只需在您的 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 .
于 2014-08-20T14:49:13.827 回答
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。

作者的博文中有更多解释。

于 2012-01-18T06:09:06.560 回答
1

使用不同的分支推送可能是一件非常棘手的事情。

也许最简单的方法是:

  1. 再次从服务器克隆您的“重要”存储库。
  2. 在您的“大项目”中生成补丁,其中包含您最初打算推送的更改(例如 git 格式补丁)(如果您的原始提交混合文件,您可能需要首先在侧分支中进行“较小”提交应该推送的文件和不应该推送的文件)
  3. 在“重要”的新克隆中应用补丁(git am)
  4. 将“重要”的新克隆推送到其默认的远程主机。现在推送只是一个简单的快进,应该不会造成麻烦。
于 2011-08-10T14:28:58.310 回答