这在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。将此存储库添加为远程,并将您的 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 和git subtree 命令。要获得新的过滤提交,我们需要分三个阶段进行。
在第一阶段,我们会将upstream-master 更新为 XBMC 存储库的当前版本。
git checkout upstream-master
git pull
这应该会拉下新的提交,如果有的话。
接下来,我们将使用提交的新过滤版本更新upstream-skin。由于git subtree 确保提交哈希相同,因此这应该是一个干净的过程。请注意,您希望在仍在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 了解更多详情。