从一个仓库转移到另一个仓库时保留提交历史记录

时间:2018-03-27 08:10:58

标签: git

有两个回购:小和大。

SMALL是独立于BIG创建的,但它们都具有完全相同的目录结构和文件(只是内容不同)。

BIG基本上是由类似的SMALL组成的(想想子模块 - 我只需要编辑一个特定的目录,不能在整个仓库上工作)

BIG的目录结构:

  

应用/
    ...文件夹一     ...文件夹二     库/
    一堆项目特定的文件

小:

  

应用/
    ...文件夹三     库/
    一堆项目特定的文件

apps/内,每个文件夹对应一个子模块。我的SMALL repo具有完全相同的目录结构,但我不想合并所有内容。只有apps/中的文件夹三。 有可能吗?

问题是,当项目在我的工作场所分配给我时,我们还没有确定将SMALL集成在哪里(有两个BIG候选人)。这就是我暂时创建个人仓库的原因。

现在是集成的时候了,我不想简单地将我的文件夹复制粘贴到BIG仓库中。我宁愿保留我的提交历史记录,但只将 相关的文件夹/文件推送到BIG仓库。

我尝试了什么:

  • git pull BIG --allow-unrelated-histories进入SMALL回购,但删除了三个文件夹(我想要的那个)
  • 我看过filter-branch,但我不太确定它是否适合我的用例。如果这是解决方案,有人可以澄清吗?如果不是,你会建议什么? (您可以假设SMALL中的每个文件除了文件夹三中的文件都不相关)

1 个答案:

答案 0 :(得分:0)

您可以在不提交的情况下合并,然后在完成合并之前清理您不想要的路径。

git merge --no-commit --allow-unrelated-histories SMALL/master
git reset -- . ':!apps/folder-three/*'
git checkout -- . ':!apps/folder-three/*'
git clean -df
git add .
git commit

按顺序:

  1. 合并这两个历史,但尚未提交
  2. 重置除文件夹三之外的所有内容。首先包含.的所有文件夹,然后排除:!<pathspec>的一个路径。请参阅pathspec
  3. 撤消文件夹三之外的所有未暂停的更改,与上一步相同的方法
  4. 删除未跟踪的文件和文件夹。 -d包含目录-f强制删除。文件夹三中的分阶段文件不会受此影响。
  5. 现在添加所有剩余的非暂停更改
  6. 并提交
  7. 这个过滤器分支的唯一优势(否则会更干净),就是你可以避免重写历史。

    如果您在提交前犯了错误,可以git merge --abort。如果合并后你不喜欢结果,你可以git reset --hard HEAD~1回到合并前的状态。