我如何 fork _of mine_ 的现有仓库?

How do I fork an existing repo _of mine_?

我有一个 GitHub 存储库 https://GitHub.com/JohnBurger/Edison

其中有许多子目录,其中包含特定于英特尔® Edison 的模块 - 但有些更通用。事实上,我现在有一个 Arduino 项目可以利用该存储库中的一些代码,所以我想我应该从 Edison 派生一个新的存储库 https://GitHub.com/JohnBurger/Arduino。只是,当我尝试时,GitHub 根本不这样做。我点击 "Fork",它想了想,然后……什么也没有。我想那是因为源代码已经是我的了,我没有机会重命名新的分支。

我想 GitHub 想让我做的是将它克隆到一个单独的本地目录,然后为它创建一个新的 repo 并将它提交回新的 - 但这样会保留完整的历史记录吗?

实际上,我真正想要做的是选择要保留目录层次结构的哪些部分以及要放弃哪些部分(例如,完全删除)。例如,假设现有的 repo 如下所示:

Edison/
   Dir1/
   Dir2/
   Dir3/
      SubDir1/
      SubDir2/
   Dir4/

我想要一个新的 repo 看起来像:

Arduino/
   Dir2/          [from Edison]
   Dir3/          [from Edison]
      SubDir2/    [from Edison (note SubDir1 is missing)]
   Dir5/          [new to this Project]

具有包含目录的所有历史记录,但 none 来自 Edison.

的无关行李

理想

但是,如果我真的希望我真的想要一个 third 回购:

General/
   Dir2/
   Dir3/
      SubDir2/

Edison/
   [link to General/]
   Dir1/
   Dir3/
      SubDir1/
   Dir4/

Arduino/
   [link to General/]
   Dir5/

这样:

但我不知道 Git 是否像那样工作......或者我是否仍然可以在这些目录中拥有特定文件的每个体系结构特定分支。

不过,如果可以的话,有人可以将说明提供给:

那就太好了,谢谢!

没错,你不能 fork 自己的仓库。

如果您将存储库克隆到新文件夹并将其推送到新存储库,则历史记录将保留。参见 this question for details

git clone https://github.com/yourname/your_repo.git repo_dir
cd repo_dir
git remote rename origin old_origin
git remote add origin https://github.com/yourname/your_repo2
git push origin master
git remote rm old_origin

实际上,fork 只是存储库的一个副本,保留了所有历史记录。

要实现第一个选项,您只需创建存储库的副本,删除不需要的文件并将更改提交回 GitHub。

第二个选项有点复杂,但 git 支持 submodules。这就是您所需要的。

有三个仓库,一个是通用的,用作另外两个的子模块。

链接

听起来像是 git submodules 的一个很好的用例。

至于拆分 repo,您​​可能需要查看 git filter-branch (some examples: link, link)。