背景
如果你的代码仓库里有多个目录,你想把其中一个目录拆分出去变成一个独立的代码仓库。重要的一点是拆分的过程中要保留git提交历史记录。
拆分步骤
1. 检查一下你的 repo 的根目录中。
进入根目录后,快速运行 ls 终端命令以确保列出所有子目录。
利用命令 git log 或 git log --onelist |wc 查看你的提交的信息和提交了多少条。
2.检查你在master分支
假设您要拆分 master 分支。 如果不是,请确保您在正确的分支中。
在您的终端中写入 git branch 以确保您位于 master 分支中。
3.退出根目录
从根目录开始,cd .. 返回上一级,直到您位于根目录的上一级。
4. 将原始的repo的目录移动到新目录
在您的终端输入下面命令。 我们这样做是因为我们即将重写您的回购历史。
mv [your root directory]/ [your root].orig
这是前两个步骤对于我的 repo 的样子,其中原始名为“bookclub-full-app”
如果你在你的电脑上查看你的文件,你会看到这个 repo 已经在本地更改了它的名字。 在 Mac 上,这是在“Finder”中
5. Clone你的repo
确保你在新重命名的目录之上(提示:如果你还没有 cd 到任何地方,你应该已经在那里了!)。
再次clone你的 repo:使用 git clone [insert repo url here]
通过快速 ls 检查并确保两者都已列出来仔细检查您是否拥有这两个回购协议。 在我的例子中,我会有 bookclub-full-app 和 bookclub-full-app.orig。
6. 确定要拆分的目录。
cd 到你新 clone 的 repo(不是 .orig)。 您应该回到根目录,您将在其中看到存储库中所有文件和目录的列表。 在我的例子中,我列出了相同的三个子目录:
确保位于根目录后,执行以下命令:
git filter-branch --prune-empty --subdirectory-filter [name of subdirectory you want to create a new repo for] -- master
在我的例子中,它看起来像这样只得到我的后端:
filter-branch 是主要的 git 命令,用于从根目录中拆分子目录。
subdirectory-filter就是我们用来表示我们要拆分到哪个子目录的,所以你直接在这个后面写你的子目录名。
— 最后的 master 显示了我们想要对其进行操作的提交。
最终,这将改写历史。 您可能会收到有关陷阱的通知,请稍等,它会在几秒钟后完成。
7.确保您已正确重写子目录及其历史记录
如果您现在键入 ls,您将看到过滤分支的子目录列表,而不是原始子目录。
我们从这个到这个:
如您所见,您的新根目录包含您想要在其自己的存储库中的所有文件。 您可以通过键入 git log 来测试它,以确保它保留了所有 git 历史记录。
8.删除对原始存储库的远程引用
确保您位于新的根目录中,键入 git remote remove origin。 如果您收到有关其他分支的警告,则可以忽略。
9. 添加新的存储库引用
您需要在 GitHub 上创建一个新的存储库并复制 url 链接来执行此操作。 准备好 url 后,执行
git remote add origin [new repo url]。
10. 将所有文件推送到新存储库
git push --all
git push --tags
11. clone 你的新的repo,来检查
cd ..
git clone [new repo url] [insert new repo name]
问题
如果你的新的repo里面readme或git等文件。这些文件是你建这个repo自带的,这个时候你不能直接push --all, 你要先执行下面的命令,再push
git pull --allow-unrelated-histories