Git:从存储库中获取子文件夹到新文件夹而不会丢失历史记录

时间:2015-02-18 12:15:46

标签: git git-submodules git-subtree

我有一个包含多个分支的应用程序的git存储库。源树由几个目录组成。 E.g:

main_folder
|--> .git
|--> dir0
|--> dir1
|--> dir2

不幸的是,从开发开始我就没有使用git-submodulesgit-subtree。现在我想将其中一个目录(例如dir0)作为新的独立应用程序移动到新的存储库中。当然,如果可能的话,我想保留相应目录的历史记录和分支。

所以我有两个问题:

  1. 第一个也是最明显的一个是我如何做到这一点?
  2. 同样对于旧存储库,最佳做法是什么?只需删除文件夹并提交更改或其他内容吗?

4 个答案:

答案 0 :(得分:3)

试试git subtree split。这可以拆分子文件夹并保留历史记录。

请参阅有关如何使用它的手册页。

答案 1 :(得分:2)

使用git splits

它基本上使用相同的git filter-branch方法,但界面更简单。

  1. 安装git splits。我基于jkeating's solution将其创建为git扩展。
  2. 将目录拆分为本地分支 #change into your repo's directory cd /path/to/repo #checkout the branch git checkout MyOldBranch #split directory or directories into new branch git splits -b MyNewBranch dir1 dir2 dir2...
  3. 如果您想要的是将其历史记录复制到新MyNewBranch分支的目录,请停止此处(您已完成)。


    如果您希望将新分支推送到独立仓库

    1. 在某处创建一个空的仓库。我们假设我们在GitHub上创建了一个名为new_repo的空仓库,其路径为:git@github.com:simpliwp/new_repo.git

    2. 推送到新的回购。 #add a new remote origin for the empty repo so we can push to the empty repo on GitHub git remote add origin_new_repo git@github.com:simpliwp/new_repo.git #push the branch to the new repo's master branch git push origin_new_repo new_repo:master

    3. 将新创建的远程仓库克隆到新的本地目录中 #change current directory out of the old repo cd /path/to/where/you/want/the/new/local/repo #clone the remote repo you just pushed to git clone git@github.com:simpliwp/new_repo.git

答案 2 :(得分:1)

我使用了Github提到的git filter-branch方法结束了。

程序如下。

  1. 将存储库克隆到新目录
  2. cd到新目录
  3. 假设我们要创建一个仅包含dir0分支master的新存储库,相应的git命令应为:

    git filter-branch --prune-empty --subdirectory-filter dir0 master

  4. 这将删除dir0以外的所有其他文件和目录。此外,它将删除与' dir0'无关的提交,这非常方便。

  5. 在原始存储库中,只需删除目录dir0并提交。

答案 3 :(得分:0)

  1. 是的,这绝对有可能!
    但是,在新存储库中具有与dir0相关的历史是不可能的(或者不容易)。然而,历史将出现在主项目中。
  2. 你能做什么!
    一个。删除dir1并提交。
    湾为dir1创建一个新的存储库 C。将其作为子模块添加到主项目中,它将作为sub-module提供给您。

    1. 是!
    2. 修改-1
      给你的用例我会建议子模块是这样做的!您可以使用git log --pretty="%H" dir-1 | xargs -n 1 git format-patch -1创建在dir-1中对“独立应用程序”进行更改的提交补丁。

      现在创建一个新的存储库,其初始存储库为空 - 承诺。您可以使用git clone git://github.com/mudassirazvi/EMPTY_COMMIT克隆类似的内容,然后按顺序逐个应用修补程序。 (您可以通过提供gitk dir1git log --oneline dir1来查看订单。
      现在您的回购已准备就绪,请将其添加为子模块

      PS:如果你的提交在同一次提交中没有多个dirs,这是直截了当的。如果任何提交都这样做,那么使用git rebase -i编辑这些提交,使“dir1”的所有提交都独立。