git - 在 GitHub 上 fork 一个存储库的子目录并使其成为我自己的存储库的一部分

标签 git github repository git-subtree xbmc

抱歉,我是 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 最有可能做到这一点,虽然这不是一个典型的用例,所以当你这样做时可能会有一些粗糙的边缘(特别是如果你是 git 的新手)。

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

设置存储库

首先克隆整个 XBMC 存储库。

git clone https://github.com/xbmc/xbmc.git
cd xbmc

我们从 master 开始默认分支。我们想自己做master分支,所以让我们重命名 masterupstream-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 中文件的提交.

现在,让我们设置 Remote 。因为你克隆了 xbmc/xbmc.git , origin Remote 将指向那里。让我们将其重命名为 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 的“ fork ”子目录。

对您的存储库进行更改

当您处理自己的本地和远程存储库时,您可以使用普通的 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

这应该会 pull 下新的提交,如果有的话。

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

git subtree split --prefix=addons/skin.confluence \
  --onto upstream-skin -b upstream-skin

upstream-skin现在已更新,您可以更新您的 master您认为合适的分支(通过 merge 或 rebase )。

git checkout master
git rebase upstream-skin

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

This blog post更详细地介绍了上面的命令。另见 git-subtree docs了解更多详情。

关于git - 在 GitHub 上 fork 一个存储库的子目录并使其成为我自己的存储库的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577084/

相关文章:

version-control - Mercurial 问题如何处理不同的头

java - 为什么 Maven 存储库中的库无法编译?

Git:错误的 merge 冲突?

git clone,上传包内存不足

python - Theano警告: The same cache key is associated to different modules

security - 如何通过 Github Webhooks 安全地加密 secret ?

git - 如何查看Github用户内容?

php - 如何在 Windows 8 的 xmpp 中安装 zend

templates - 是否可以通过 Github 拉取请求模板添加 "Reviewers"

javascript - 复杂的构建/项目管理