背景

如果你的代码仓库里有多个目录,你想把其中一个目录拆分出去变成一个独立的代码仓库。重要的一点是拆分的过程中要保留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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐