抱歉,我是 Git 和 GitHub 的新手,我已经阅读了一些内容,但我不确定我正在尝试做的事情完全是否可行。
基本上我想 fork XBMC 上使用的 Confluence Skin 并修改位于此处的各种元素:
https://github.com/xbmc/xbmc/tree/master/addons/skin.confluence
但是我不想 fork 整个 XBMC 存储库,所以一个简单的 fork 操作是行不通的。
以下是我的一般要求:
我想将 skin.confluence 文件夹中的内容放入我自己的 GitHub 帐户的存储库中
我需要能够在原始 XBMC 存储库中保持链接以接收上游提交,因为我的修改通常是基于主题的,而不是基于功能的。
感谢 tbekolay 发布的回复,我已经能够进行子树拆分以仅采用 repo 的 skin.confluence 部分并实质上创建一个分支,但是我不确定如何保持它与原始 XBMC 的链接 repo ,同时通过我的修改被推送到我自己的 repo 。
最佳答案
使用 git
最有可能做到这一点,虽然这不是一个典型的用例,所以当你这样做时可能会有一些粗糙的边缘(特别是如果你是 git
的新手)。
我们将用于这项工作的工具是 git subtree
.
设置存储库
首先克隆整个 XBMC 存储库。
git clone https://github.com/xbmc/xbmc.git
cd xbmc
我们从 master
开始默认分支。我们想自己做master
分支,所以让我们重命名 master
至 upstream-master
.
git branch -m upstream-master
现在使用 git subtree split
只包括你想要的部分。我们将使拆分部分成为一个名为 upstream-skin
的新分支.
git subtree split --prefix=addons/skin.confluence -b upstream-skin
git checkout upstream-skin
这给你一个新的 upstream-skin
仅包含 addons/skin.confluence
内容的分支, 以及过滤后的历史记录,其中仅包含修改 addons/skin.confluence
中文件的提交.
现在,让我们设置 Remote 。因为你克隆了 xbmc/xbmc.git
, origin
Remote 将指向那里。让我们将其重命名为 upstream
.
git remote rename origin upstream
在 Github 上创建一个存储库以包含您对 addons/skin.confluence
的修改.例如,我将使用 tbekolay/xbmc-skin,但将其替换为您自己的存储库。将此 repo 添加为远程,并推送你的 upstream-skin
分支到它。
git remote add origin https://github.com/tbekolay/xbmc-skin.git
git fetch origin
git push -u origin upstream-skin
最后,我们将创建一个名为 master
的新分支这将包含您的更改。
git checkout -b master
git push -u origin master
你现在有了一个 addons/skin.confluence
的“ fork ”子目录。
对您的存储库进行更改
当您处理自己的本地和远程存储库时,您可以使用普通的 git
命令。确保在 master
上执行此操作分支(或其他分支,如果你愿意的话)而不是 upstream-skin
分支,它应该只包含来自上游项目的提交。
git checkout master
echo "My XBMC Skin" > README
git add README
git commit -m "Added README"
git push
接收上游提交
当您处理上游存储库时,您将不得不混合使用 git
和 git subtree
命令。要获得新的过滤提交,我们需要分三个阶段进行。
在第一阶段,我们将更新upstream-master
到 XBMC 存储库的当前版本。
git checkout upstream-master
git pull
这应该会 pull 下新的提交,如果有的话。
接下来,我们将更新upstream-skin
使用新的过滤版本的提交。自 git subtree
确保提交哈希相同,这应该是一个干净的过程。请注意,您希望在 仍在 upstream-master
上时运行这些命令分支.
git subtree split --prefix=addons/skin.confluence \
--onto upstream-skin -b upstream-skin
与 upstream-skin
现在已更新,您可以更新您的 master
您认为合适的分支(通过 merge 或 rebase )。
git checkout master
git rebase upstream-skin
请注意,XBMC 存储库非常庞大,而且 git subtree
命令将花费相当多的时间来过滤所有这些历史记录——并且由于每次与远程存储库交互时都会重新生成拆分子树,因此这是一项非常昂贵的操作。我不确定这是否可以加快。
This blog post更详细地介绍了上面的命令。另见 git-subtree
docs了解更多详情。
关于git - 在 GitHub 上 fork 一个存储库的子目录并使其成为我自己的存储库的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577084/