首页 > 解决方案 > 将 GitHub 存储库移至组织,但有特定要求

问题描述

我有一个 GitHub 存储库,其中包含 3 个文件夹并有 1500 个提交:

存储库:
文件夹 I
文件夹 II
文件夹 III

我想做的事情是将存储库移动到 GitHub 组织,但我希望组织中的每个文件夹都有 3 个存储库:

一个组织:
存储库 I == 文件夹 I
存储库 II == 文件夹 II
存储库 III == 文件夹 III

但是这里的具体部分是,我希望每个存储库都保留提交,它们是针对特定文件夹的,如下所示:

一个组织:
存储库 I -> 300 次提交,与文件夹 I 相关
存储库 II -> 500 次提交,与文件夹 II 相关

因为当我进行迁移时,我不想丢失为每个文件夹所做的提交。这可能吗?有什么方法可以做到?

标签: gitgithub

解决方案


假设您的文件结构是

- original_repo
    └- .git
    └- folder_I
    |    └- library_1.js
    |
    └- folder_II
    |    └- library_2.js
    |
    └- folder_III
    |    └- library_3.js
    |
    └- .gitignore
    └- .eslintrc
    └- index.js
    └- package.jon

1.克隆到新的本地副本

每个文件夹将在过程结束时包含您分离的存储库。

git clone git@github.com:georgi/original_repo subfolder_one
git clone git@github.com:georgi/original_repo subfolder_two
git clone git@github.com:georgi/original_repo subfolder_three

为他们每个人在您的组织中创建一个存储库。在每个文件夹上,将遥控器指向组织存储库。

cd subfolder_one
git remote set-url origin git@github.com:organization/subfolder_one

cd ../subfolder_two
git remote set-url origin git@github.com:organization/subfolder_two


cd ../subfolder_three
git remote set-url origin git@github.com:organization/subfolder_three

现在每个都是一个单独的回购所以你不要破坏原来的,请注意。

2. 使子文件夹成为新的根目录

现在在每个子文件夹中,重写历史记录,以便仅包括对所述子文件夹进行修改的提交。这将重写你原来的sha

只是为了比较,让我们看看你在原始仓库中有多少次提交

cd ../subfolder_one
git log --oneline | wc -l
# it print let's say, 500, so you have 500 commits in your original repo

让我们将子文件夹设置为这个新仓库的新根文件夹

git filter-branch --prune-empty --subdirectory-filter folder_I

现在您的本地内容只有前一个文件夹_I(加上一个.git文件夹)的内容

- subfolder_one
  └- .git
  └- library_1.js

让我们看看我们现在有多少提交(正如我所说,sha 是不同的,但他们保留了它的日期、作者和评论)

git log --oneline | wc -l
# it print let's say, 100, just the commits that ever touched the subfolder

您现在可以将此 repo 推送到新的来源。您可能必须强制推动。只要确保您指向组织来源,就不会破坏原始存储库。

3. 弄清楚如何从那时起保持你的项目

您的原始项目仍然需要子文件夹,或者我猜是这样。方法由你自己决定,但这将涉及删除现在分离的子文件夹并将它们作为子模块或依赖项包含(你可以在 npm/yarn、composer 和大多数包管理器中使用 github 依赖项)


推荐阅读