在 GitHub 上创建一个存储库的子目录并将其作为我自己的存储库的一部分

Posted

技术标签:

【中文标题】在 GitHub 上创建一个存储库的子目录并将其作为我自己的存储库的一部分【英文标题】:Forking a sub directory of a repository on GitHub and making it part of my own repo 【发布时间】:2014-08-25 22:58:56 【问题描述】:

抱歉,我对 Git 和 GitHub 很陌生,我已经阅读了一些内容,但我不确定我想要做的事情是否完全可能。

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

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

但是我不想 fork 整个 XBMC 存储库,所以一个简单的 fork 操作是行不通的。

以下是我的一般要求:

我想将 skin.confluence 文件夹中的内容放到我自己的 GitHub 帐户上的存储库中

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

感谢 tbekolay 发布的回复,我已经能够进行子树拆分以仅获取 repo 的 skin.confluence 部分并基本上创建一个分支,但是我不确定如何将其与原始 XBMC 保持联系repo,同时通过我的修改被推送到我自己的 repo。

【问题讨论】:

我认为这是不可能的。其他版本控制系统也可以,但 git 只允许克隆整个存储库。您可以尝试说服 xmbc 团队将皮肤拆分到单独的存储库中。 @Thayne 所以在这种情况下,颠覆可能更适合我的要求?还是只使用 Git 但手动从上游拉取更改? 是的。假设维护了一个 SVN 存储库。 我已经重写了我的答案,提供了有关如何设置存储库以及如何接收上游提交的更多详细信息。是否值得麻烦取决于您;)命令需要很长时间才能运行,但我认为它已经完成了一些干净。 @tbekolay 感谢您花时间更新自我最初发布以来的先前答案。我现在将经历一切,看看! 【参考方案1】:

这在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

接收上游提交

当您处理上游存储库时,您必须混合使用gitgit 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 了解更多详情。

【讨论】:

谢谢你,我一直看到提到的子树和子模块,我会检查一下,看看我能做什么。 绝对不要使用子模块,原因有很多,其中最突出的是您必须对 XMBC 存储库进行更改才能使用它。 感谢您的提醒! @tbekolay,谢谢,这真的很有用。问题:如果我想从几个不同的上游收集子目录,这可能吗?我看到第一个命令是git clone,这使得从几个不同的上游分叉变得困难。请在此处回答 -> ***.com/questions/45201567。谢谢。 这篇博文很遗憾地消失了。可以在返航机上找到:web.archive.org/web/20131123125622/http://blog.charlescy.com/…

以上是关于在 GitHub 上创建一个存储库的子目录并将其作为我自己的存储库的一部分的主要内容,如果未能解决你的问题,请参考以下文章

将远程 github 存储库的更改合并到本地存储库

如何链接到 GitHub 存储库的***目录

没有本地存储库的 github

无法读取所需库的存档或不是有效的 ZIP 文件

创建 github 存储库的“副本”

setup.py 拉入非 Python github repos 并将它们放在正确的目录中?