我如何 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/
这样:
General/
仍然保留我在开发 Edison/
时所做的所有更改。
- 如果我将来对
General/
中的任何内容进行更改,那么 Edison/
和 Arduino/
都会受益。
- 任何人只需获得
Edison/
或 Arduino/
即可获得整个 shebang,准备编译。
但我不知道 Git 是否像那样工作......或者我是否仍然可以在这些目录中拥有特定文件的每个体系结构特定分支。
不过,如果可以的话,有人可以将说明提供给:
- 从
Edison/
创建 General/
,维护历史记录;
- 从
Edison/
中删除 General/
,清除历史记录;
- 将
General/
链接到 Edison/
;
- 正在创建
Arduino/
并将 General/
链接到其中;
- 如何在
General/
. 中拥有特定于体系结构的文件版本
那就太好了,谢谢!
没错,你不能 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)。
我有一个 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/
这样:
General/
仍然保留我在开发Edison/
时所做的所有更改。- 如果我将来对
General/
中的任何内容进行更改,那么Edison/
和Arduino/
都会受益。 - 任何人只需获得
Edison/
或Arduino/
即可获得整个 shebang,准备编译。
但我不知道 Git 是否像那样工作......或者我是否仍然可以在这些目录中拥有特定文件的每个体系结构特定分支。
不过,如果可以的话,有人可以将说明提供给:
- 从
Edison/
创建General/
,维护历史记录; - 从
Edison/
中删除General/
,清除历史记录; - 将
General/
链接到Edison/
; - 正在创建
Arduino/
并将General/
链接到其中; - 如何在
General/
. 中拥有特定于体系结构的文件版本
那就太好了,谢谢!
没错,你不能 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)。