这大多是可能的git
,尽管这不是一个典型的用例,所以当您这样做时可能会遇到一些粗糙的问题(特别是如果您是新手git
).
我们将用于这项工作的工具是git subtree
.
设置存储库
首先克隆整个 XBMC 存储库。
git clone https://github.com/xbmc/xbmc.git
cd xbmc
我们从master
默认分支。我们想做我们自己的master
分支,所以让我们重命名master
to upstream-master
.
git branch -m upstream-master
Now use 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
, the origin
遥控器将指向那里。让我们将其重命名为upstream
.
git remote rename origin upstream
在 Github 上创建一个存储库来包含您的修改addons/skin.confluence
。作为示例,我将使用 tbekolay/xbmc-skin,但将其替换为您自己的存储库。将此存储库添加为遥控器,然后推送您的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
子目录。
更改您的存储库
当您处理自己的本地和远程存储库时,可以使用普通git
命令。确保在master
分支(或其他一些分支,如果您愿意的话)而不是upstream-skin
分支,它应该只包含来自上游项目的提交。
git checkout master
echo "My XBMC Skin" > README
git add README
git commit -m "Added README"
git push
接收上游提交
当您处理上游存储库时,您将不得不混合使用git
and git subtree
命令。为了获得新的过滤提交,我们需要分三个阶段进行。
第一阶段我们会更新upstream-master
到 XBMC 存储库的当前版本。
git checkout upstream-master
git pull
这应该会拉下新的提交(如果有的话)。
接下来我们将更新upstream-skin
使用新的过滤版本的提交。自从git subtree
确保提交哈希值相同,这应该是一个干净的过程。请注意,您希望在运行这些命令时仍在upstream-master
branch.
git subtree split --prefix=addons/skin.confluence \
--onto upstream-skin -b upstream-skin
With upstream-skin
现已更新,您可以更新您的master
根据您的需要进行分支(通过合并或变基)。
git checkout master
git rebase upstream-skin
请注意,XBMC 存储库非常庞大,并且git subtree
命令将花费相当多的时间来过滤所有历史记录 - 并且由于每次与远程存储库交互时都要重新生成分割子树,因此这是一项相当昂贵的操作。我不确定这是否可以加快。
这篇博文 https://web.archive.org/web/20131123125622/http://blog.charlescy.com/blog/2013/08/17/git-subtree-tutorial/更详细地介绍上面的命令。另请参阅git-subtree docs https://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt了解更多详细信息。