我有一个GitHub存储库https://GitHub.com/JohnBurger/Edison。
在其中有许多子目录,其中包含特定于英特尔®Edison的模块 - 但有些子目录更通用。事实上,我现在有一个Arduino项目,可以利用该存储库中的一些代码,所以我想我会从Edison
分叉一个新的存储库https://GitHub.com/JohnBurger/Arduino。只是,当我尝试时,GitHub根本就没有这样做。我点击“Fork”,它会考虑它,然后......没有。我认为这是因为源代码已经是我的,我没有机会重新命名新的分支。
我认为GitHub要我做的是将它克隆到一个单独的本地目录中,然后为它创建一个新的repo并将其提交回新的目录 - 但这会保留完整的历史记录吗?
实际上,我真正想要做的是选择保留目录层次结构的哪些部分以及放弃哪些部分(如同,完全删除)。例如,假设现有的仓库看起来像这样:
Edison/
Dir1/
Dir2/
Dir3/
SubDir1/
SubDir2/
Dir4/
我想要一个新的回购看起来像:
Arduino/
Dir2/ [from Edison]
Dir3/ [from Edison]
SubDir2/ [from Edison (note SubDir1 is missing)]
Dir5/ [new to this Project]
包含所包含目录的所有历史记录,但没有来自Edison
的无关紧要的行李。
但是,如果我真的希望我真的想要一个第三个回购:
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是否可以这样工作......或者我是否仍然可以在这些目录中拥有某些文件的特定于每个体系结构的分支。
如果可以,有人可以提供说明:
General/
创建Edison/
,维护历史记录; General/
移除Edison/
,清除历史记录; General/
关联到Edison/
; Arduino/
并将General/
链接到其中; General/
。那将是理想的,谢谢!
答案 0 :(得分:2)
这是真的,你不能分叉自己的存储库。
如果将存储库克隆到新文件夹并将其推送到新的存储库,则会保留历史记录。请参阅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。这就是你所需要的。
有三个repos,一个Generic,用作其他两个的子模块。
<强>链接强>
答案 1 :(得分:0)
听起来像是git submodules的一个很好的用例。
至于拆分回购,您可能需要查看git filter-branch
(某些示例:link,link)。