分离回购的子目录并使其成为另一个回购的分支?

时间:2012-02-29 21:13:36

标签: git git-filter-branch

我有一个git repo,说repoA,有很多子目录。如何分离其中一个子目录,例如dir1,并将其作为单独的分支(带历史记录)添加到另一个仓库中?

其次,如何从repoA中删除分离的子目录?

1 个答案:

答案 0 :(得分:1)

问题的第一部分:

  

如何分离其中一个子目录,例如dir1,并将其作为单独的分支(带历史记录)添加到另一个仓库?

git checkout -b tempBranch
git filter-branch --subdirectory-filter dir1 --prune-empty 

在第二个存储库中:

git remote add filtered_dir1 ../original_repo
git fetch filtered_dir1
git merge filtered_dir1/tempBranch

问题的第二部分:

  

其次,如何从repoA中删除分离的子目录?

$ git filter-branch --index-filter“git rm -r -f --cached --ignore-unmatch dir1”--prune-empty

这可能会失败并显示无法进行备份的警告;我不确定这是什么意思,但添加-f会迫使git-filter-branch继续运行。

这将仅在当前分支中运行。如果您想在所有分支上运行它,请附加-- --all。请注意-- --all

有些说明:

  1. 运行git filter-branch时,您将过滤您所在的分支。 (显然,如果你考虑一下)。如果您尝试提取某些历史记录以推送到第二个存储库,您可能希望在新分支git filter-branch,以便原始存储库不会丢失任何内容。

  2. This question中包含一些有用的信息。

  3. git filter-branch --subdirectory-filtersubdirectory设为分支的新根目录 - 它会将文件从subdirectory移至/。要解决此问题,EXAMPLES的{​​{1}}部分底部有一个示例:

      

    将整个树移动到子目录中,或从中删除它:

    man git-filter-branch