web-dev-qa-db-ja.com

GitHubでリポジトリのサブディレクトリをフォークし、それを自分のリポジトリの一部にする

申し訳ありませんが、私はGitとGitHubに非常に慣れていません。いくつかのことを読みましたが、私がやろうとしていることが完全に可能かどうかはわかりません。

基本的に、XBMCで使用されているConfluenceスキンをフォークして、ここにあるさまざまな要素を変更したいと思います。

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

ただし、XBMCリポジトリ全体をフォークしたくないので、単純なフォークアクションでは実行できません。

これが私の一般的な要件です:

  • Skin.confluenceフォルダーの内容を取得して、自分のGitHubアカウントのリポジトリに配置したいと思います。

  • 私の変更は通常、機能ではなくテーマベースであるため、アップストリームコミットを受信するには、元のXBMCリポジトリ内でリンクを維持できる必要があります。

Tbekolayによって投稿された応答のおかげで、サブツリー分割を実行して、リポジトリのskin.confluence部分のみを取得し、基本的にブランチを作成することができましたが、元のXBMCリポジトリとのリンクを維持する方法がわかりません。私の変更で自分のリポジトリにプッシュされました。

27
James White

これはほとんどの場合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

addons/skin.confluenceへの変更を含めるために、Githubにリポジトリを作成します。例として、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コマンドとgit subtreeコマンドを組み合わせて使用​​する必要があります。新しいフィルタリングされたコミットを取得するには、3つの段階でそれを行う必要があります。

最初の段階では、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コマンドはそのすべての履歴をフィルタリングするのにかなりの時間がかかることに注意してください。リモートリポジトリと対話するたびに分割サブツリーを再生成するため、かなり高価な操作。これをスピードアップできるかどうかはわかりません。

このブログ投稿 上記のコマンドについてさらに詳しく説明します。詳細については、 git-subtree docs も参照してください。

43
tbekolay