【问题标题】:git push a sub-directory into another main repogit push 一个子目录到另一个主仓库
【发布时间】:2011-10-24 01:51:24
【问题描述】:

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

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

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

大型项目布局,其中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 已更改,我想将重要的子树 推送到 repo ~/devel/important。所以之后~/devel/important/efg.txt也有变化。

我唯一能做的就是将bigproject中的everything推入important,这显然不是我想要的。只应推送子树中的更改。

【问题讨论】:

    标签: git git-push git-subtree


    【解决方案1】:

    这不再那么复杂了,你可以在你的 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 .
    

    【讨论】:

    • 很有魅力。你应该提到YOUR_SUBDIR 将成为重写 repo 的根目录(这正是我想要的)。另外,我不明白push:我的新远程网址?为什么是-f(强制)? "." 是什么意思?是这里的意思吗?我无法重新创建您的推送。所以我选择了cd .. ; git clone &lt;rewritten_repo&gt; &lt;new_directory&gt;——完美。
    • 推送是将提取的文件添加到新的远程。那个编辑更清楚了吗?
    • "the" 新遥控器?我想你是说我不能将重写的 repo 推送到当前的遥控器上,因为历史被重写了。所以最好初始化一个新的 repo(裸的,在服务器上,等等)并将重写的推送到那里。
    • 我假设你仍然想要旧的 repo 来处理你没有提取的任何东西。
    • 我明白了。不,在这种情况下,我可以覆盖所有内容。我有备份:-)
    【解决方案2】:

    我会推荐在 git 中添加 git-subtree。它添加了一个 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有更多解释。

    【讨论】:

      【解决方案3】:

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

      也许最简单的方法是:

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

      【讨论】:

      • > 这就是我的想法。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2019-03-10
      • 2014-09-09
      • 1970-01-01
      • 2013-10-07
      相关资源
      最近更新 更多