我有一个git代码库,比如repoA,里面有很多子目录。我如何分离其中一个子目录,比如dir1,并将其作为单独的分支(带历史记录)添加到另一个存储库?
其次,如何从repoA中删除分离的子目录的历史记录?
发布于 2012-03-02 21:23:45
问题的第一部分:
如何分离其中一个子目录,例如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筛选器分支--索引-筛选器"git rm -r -f --cached --ignore--unmatch dir1“--prune-empty
这可能会失败,并显示无法进行备份的警告;我不确定这是怎么回事,但是添加-f将强制git-filter-branch运行。
这将在current分支only中运行。如果您想在所有分支上运行它,可以附加-- --all。请注意-- --all。
一些注意事项:
git filter-branch时,您将过滤您所在的分支。(很明显,如果你仔细想想的话)。如果您正在尝试提取一些历史记录以推送到第二个存储库,您可能希望在的新分支上执行git filter-branch,这样原始存储库就不会丢失任何内容。git filter-branch --subdirectory-filter将使subdirectory成为分支的新根目录-它会将文件从subdirectory移动到/。为了解决这个问题,在man git-filter-branch的EXAMPLES部分的底部有一个示例:要将整个树移动到子目录中或从中删除,请执行以下操作:
git filter-branch --index-filter \ 'git ls-files -s | sed "s-\t\"\*-&newsubdir/-" | GIT\_INDEX\_FILE=$GIT\_INDEX\_FILE.new \ git update-index --index-info && mv "$GIT\_INDEX\_FILE.new" "$GIT\_INDEX\_FILE"' HEADhttps://stackoverflow.com/questions/9506710
复制相似问题