基本上我想分叉XBMC上使用的Confluence Skin并修改位于此处的各种元素:
https://github.com/xbmc/xbmc/tree/master/addons/skin.confluence
但是我不想分叉整个XBMC存储库,所以一个简单的fork操作不会做。
以下是我的一般要求:
我想获取skin.confluence文件夹的内容并将其放入我自己的GitHub帐户的存储库中
我需要能够在原始XBMC回购中保持链接以接收上游提交,因为我的修改通常是基于主题的,而不是功能。
感谢tbekolay发布的响应,我已经能够进行子树拆分,只采用repo的skin.confluence部分并基本上创建一个分支,但我不确定如何保持它与原始XBMC链接在我的修改被推送到我自己的仓库时回购。
答案 0 :(得分:39)
这主要是使用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
中已修改文件的提交。
现在,让我们设置我们的遥控器。自从您克隆xbmc/xbmc.git
后,origin
遥控器就会指向那里。我们将其重命名为upstream
。
git remote rename origin upstream
在Github上创建一个存储库,以包含对addons/skin.confluence
的修改。举个例子,我会使用tbekolay / xbmc-skin,但用你自己的repo替换它。将此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
你现在有一个" fork" addons/skin.confluence
子目录。
当您处理自己的本地和远程存储库时,可以使用普通的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
如果有任何提交,这应该会删除新的提交。
接下来,我们将使用新的过滤版本的提交更新upstream-skin
。由于git subtree
确保提交哈希值相同,因此这应该是一个干净的过程。请注意,您希望在{strong>仍位于upstream-master
分支时运行这些命令。
git subtree split --prefix=addons/skin.confluence \
--onto upstream-skin -b upstream-skin
现在更新upstream-skin
,您可以根据需要更新master
分支(通过合并或重新定位)。
git checkout master
git rebase upstream-skin
请注意,XBMC存储库是巨大的,git subtree
命令将花费相当多的时间来过滤所有历史记录 - 并且因为您每次与之交互时都重新生成拆分子树远程存储库,这是一个非常昂贵的操作。我不确定这是否可以加快。
This blog post详细介绍了上述命令。另请参阅git-subtree
docs以获取更多详细信息。