我有一个很大的主项目,有几个目录为子树。
我希望将一个特定子树中的更改推送到其原点,这是一个单独的存储库。
麻烦似乎是,我想要推送的当前子树最初并非来自我想要推送的存储库。它来自一个不同的回购,通过谷歌搜索找到的子树指南。它看起来非常相似。
大项目布局,其中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 中的所有推送到重要中,这显然不是我想要的。只应推送子树中的更改。
答案 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)
推进不同的分支可能是一个非常棘手的事情。
也许最简单的方法是: