【问题标题】:Is it possible to move a bunch of files from one git repository to another while preserving (most) history?是否可以在保留(大多数)历史记录的同时将一堆文件从一个 git 存储库移动到另一个存储库?
【发布时间】:2010-07-07 07:52:48
【问题描述】:

我将一些文件添加到错误的存储库中,直到后来才意识到,一旦它们已经有相当多的历史记录(只是线性修订,没有分支或任何东西)。

是否有可能获取这些文件并将它们连同它们的历史记录一起移动到另一个 git 存储库?我不在乎他们的残余是否留在当前的,只要新的拥有一切。

【问题讨论】:

  • 我不是 GIT 专家,但您能否: 1. 克隆目标仓库。 2.将错误的源推送到克隆的目标中。 3. 重新设置您想要保留的变更集。 4. 只将那些变更集推回原始仓库?正如我所说,我不是 GIT 专家,所以我什至不知道这是否可能。
  • 另外结帐this(几乎重复)问题。拥有成千上万的浏览量,这可能是更权威的答案。

标签: git


【解决方案1】:

使用git log -p <filename> > <patchfile>(请参阅doc),您可以导出文件的整个历史记录,然后可以通过git apply --reverse --index <patchfile> 将其应用于其他存储库。但是,这不会重新创建提交,我 haven't figured out 切换 git-apply 来执行此操作。

如果您想删除原始 repo 中的文件,请参阅"How do I remove sensitive files from git’s history?"。

【讨论】:

  • 我最终得到了 git log -p 的 ruby​​scripting 输出,并将其转换为一系列补丁/git add/git commit - 对于这个简单的案例来说已经足够好了,即使感觉真的不对。
  • @taw 您介意将该脚本发布为my question 的答案吗?解决方法总比没有好,未来的访问者可能会感谢此帮助
  • 使用 git 版本 1.7.10.3 git apply --reverse --indexed <patchfile> 将返回 error: unknown option indexed'`
【解决方案2】:

您可以执行以下操作。

  1. 使用git fetch 将带有所需文件的分支的尖端从错误的存储库拉到正确的存储库中。
  2. 将git filter-branch 与--tree-filter 或--index-filter 结合使用可从获取的分支中删除所需文件以外的所有内容。
  3. 使用git rebase 或将整理好的提交重新应用到正确存储库中的适当主分支。

【讨论】:

    【解决方案3】:

    你可以在你正在修改的分支上尝试git format-patch,为在该 repo 上不正确地进行的最后一次提交生成补丁。
    见this SO question。

    然后,您可以将这些路径应用到正确的存储库中。
    你会reset --hard你当前的分支来摆脱额外的提交。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多