在GitHub上分配存储库的子目录并使其成为我自己的repo的一部分

时间:2014-07-04 15:06:42

标签: git github repository git-subtree xbmc

抱歉,我是Git和GitHub的新手,我已经阅读了一些内容,但我不确定我尝试做的是完全可能。

基本上我想分叉XBMC上使用的Confluence Skin并修改位于此处的各种元素:

https://github.com/xbmc/xbmc/tree/master/addons/skin.confluence

但是我不想分叉整个XBMC存储库,所以一个简单的fork操作不会做。

以下是我的一般要求:

  • 我想获取skin.confluence文件夹的内容并将其放入我自己的GitHub帐户的存储库中

  • 我需要能够在原始XBMC回购中保持链接以接收上游提交,因为我的修改通常是基于主题的,而不是功能。

感谢tbekolay发布的响应,我已经能够进行子树拆分,只采用repo的skin.confluence部分并基本上创建一个分支,但我不确定如何保持它与原始XBMC链接在我的修改被推送到我自己的仓库时回购。

1 个答案:

答案 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

接收上游提交

当您处理上游存储库时,您必须混合使用gitgit 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以获取更多详细信息。