我有一个大型的git代码库,其文件夹结构如下:
/A
/B
/C
/D
...
我希望能够将/A和/B文件夹从原有仓库中提取出来,并且保留它们的历史记录(我只关心主分支)。因此,新的仓库应该是这样的:
/A
/B
我该怎么做?我发现git filter-branch可以帮助重写历史记录,但我不确定如何在保留多个子目录的同时使用它。
我有一个大型的git代码库,其文件夹结构如下:
/A
/B
/C
/D
...
我希望能够将/A和/B文件夹从原有仓库中提取出来,并且保留它们的历史记录(我只关心主分支)。因此,新的仓库应该是这样的:
/A
/B
我该怎么做?我发现git filter-branch可以帮助重写历史记录,但我不确定如何在保留多个子目录的同时使用它。
git clone initial final
cd final
git filter-branch --tree-filter 'rm -rf <list of folders separated by space>' HEAD
git filter-branch -f --prune-empty
可以用来删除在已删除文件夹列表中出现的任何空提交。
或者,如果您有一个具有相当长历史记录的大型存储库,则可能需要一段时间。在这种情况下,您可以采取稍微不同的方法 -
首先为要迁移的每个文件夹创建单独的存储库。可以使用以下filter-branch命令完成此操作。
git filter-branch –prune-empty –subdirectory-filter A/ master
git filter-branch –prune-empty –subdirectory-filter B/ master
git clone <remote path> NewRepo
cd NewRepo
# add a readme file
touch Readme.md
git add .
git commit -am "Adding ReadMe file"
# Merge Repo A
git remote add -f A <remote path for A>
git merge -s ours --no-commit A/master
git read-tree --prefix=A/ -u A/master
git commit -m "Merge A into NewRepo"
git remote remove A
# Merge Repo B
git remote add -f B <remote path for B>
git merge -s ours --no-commit B/master
git read-tree --prefix=B/ -u B/master
git commit -m "Merge B into NewRepo"
git remote remove B
git remote add origin <remote path for NewRepo>
git push origin master
NewRepo现在应该包含这些文件夹以及它们的所有历史记录。
filter-branch 可能需要一些时间来运行,但我建议尝试在本地复制存储库并将其用于测试。
git clone repoA repoB
cd repoB
git filter-branch --tree-filter 'rm -rf C D <other files you DON'T want>' HEAD
可能需要很长时间才能运行,但我认为它会做你要找的东西。