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

Jam*_*ite 23 git github repository xbmc git-subtree

抱歉,我是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 repo链接我修改后推到了自己的仓库.

tbe*_*lay 46

这通常是可能的git,虽然它不是一个典型的用例,所以当你这样做时可能会有一些粗糙的边缘(特别是如果你是新手git).

我们将用于此工作的工具是git subtree.

设置存储库

首先克隆整个XBMC存储库.

git clone https://github.com/xbmc/xbmc.git
cd xbmc
Run Code Online (Sandbox Code Playgroud)

我们master默认从分支开始.我们想要创建自己的master分支,所以让我们重命名masterupstream-master.

git branch -m upstream-master
Run Code Online (Sandbox Code Playgroud)

现在git subtree split用来只包含你想要的部分.我们将拆分成为一个新的分支upstream-skin.

git subtree split --prefix=addons/skin.confluence -b upstream-skin
git checkout upstream-skin
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个新upstream-skin分支,该分支仅包含内容addons/skin.confluence,并且包含仅包含已修改文件的提交的筛选历史记录addons/skin.confluence.

现在,让我们设置我们的遥控器.自从你克隆后xbmc/xbmc.git,origin遥控器将指向那里.让我们重命名为upstream.

git remote rename origin upstream
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

最后,我们将创建一个master包含您的更改的新分支.

git checkout -b master
git push -u origin master
Run Code Online (Sandbox Code Playgroud)

你现在有一个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
Run Code Online (Sandbox Code Playgroud)

接收上游提交

当您处理上游存储库时,您将不得不使用混合gitgit subtree命令.要获得新的过滤提交,我们需要分三个阶段完成.

在第一阶段,我们将更新upstream-master到当前版本的XBMC存储库.

git checkout upstream-master
git pull
Run Code Online (Sandbox Code Playgroud)

如果有的话,这应该删除新的提交.

接下来,我们将upstream-skin使用新的过滤版本的提交进行更新.由于git subtree确保提交哈希值相同,因此这应该是一个干净的过程.请注意,您仍希望upstream-master分支上运行这些命令.

git subtree split --prefix=addons/skin.confluence \
  --onto upstream-skin -b upstream-skin
Run Code Online (Sandbox Code Playgroud)

随着upstream-skin现在已经更新,您可以更新master您认为合适的(无论是通过合并或重定基)的分支.

git checkout master
git rebase upstream-skin
Run Code Online (Sandbox Code Playgroud)

请注意,XBMC存储库是巨大的,并且git subtree命令将花费相当多的时间来过滤所有历史记录 - 并且由于每次与远程存储库交互时都重新生成拆分子树,因此这是非常昂贵的操作.我不确定这是否可以加速.

这篇博文详细介绍了上述命令.另请参阅git-subtree文档以获取更多详细信息.

  • 由于多种原因,绝对远离子模块,其中最突出的是您必须对XMBC存储库进行更改才能使用它. (2认同)
  • 这篇博文遗憾地消失了。可以在这里找到回程机:https://web.archive.org/web/20131123125622/http://blog.charlescy.com/blog/2013/08/17/git-subtree-tutorial/ (2认同)