如何将目录从一个git存储库复制到另一个git存储库,保留历史记录?

时间:2012-09-08 00:25:51

标签: git git-filter-branch

我知道我可以从git存储库的目录中创建一个新的存储库。见这里:https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/

但是,如何将目录从一个存储库复制到另一个完全不同的存储库的新目录,同时保留该目录的历史记录?

更新:该历史记录是否可以显示git log?

1 个答案:

答案 0 :(得分:6)

您可以使用git filter-branch执行此操作。基本上你想要:

  1. 使用您已找到的链接将第一个项目中的子路径拆分为新的存储库。
  2. 将其推送到唯一分支上的第二个项目的远程。
  3. 将该分支提取到第二个存储库,然后使用git filter-branch将其索引过滤到正确的子目录中:

    git filter-branch --index-filter '
        git ls-files -sz | 
        perl -0pe "s{\t}{\tnewsubdir/}" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --clear -z --index-info &&
            mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
    ' HEAD
    
  4. 最后,检查第二个项目的master分支(或您正在使用的任何分支),然后合并到新过滤的分支中。

  5. 总而言之,操作真的不是太可怕了。正如AlexanderGladysh在评论中指出的那样,你也可以在步骤3和4的位置使用subtree merging strategy