HOWTO · Git

特定のリビジョンで Git リポジトリを複製する

特定の変更セットで Git リポジトリのクローンを作成するために使用できるさまざまな方法。

このページの内容

この記事では、特定のリビジョンまたは変更セットで Git リポジトリを複製するために使用できるさまざまな方法について説明します。 大きなファイルを含むリポジトリがあり、特定のコード バージョンのみが必要な場合に便利です。

リポジトリ全体を複製する代わりに、特に大きなファイルを扱っている場合に、複製時間を短縮するのに役立つ特定の変更セットを取得できます。

特定のリビジョンで Git リポジトリを複製する

いくつかの方法を使用して、特定の変更セットでリポジトリを複製できます。 関心のあるコミットで git fetch コマンドを使用できるようにする Git の最近の開発から始めましょう。

Git バージョン 2.5.0 より前では、git fetch origin <commit id> は機能しませんでした。 バージョン 2.5.0 のリリースで、サーバー側で uploadpack.allowReachableSHA1InWanttrue に設定するオプションが Git に含まれるようになりました。

true に設定すると、到達可能なコミットを取得できます。 この機能はデフォルトでオフになっており、セキュリティとパフォーマンス上の理由からお勧めできません。

Bitbucket などの一部の Git サーバーでは、通常、デフォルトでこの機能がオンになっています。 次の手順に従って、特定の変更セットで大きな Git リポジトリの小さなサブセットを取得します。

クローン先のディレクトリで Git リポジトリを初期化します。

$ git init

次に、リモートをローカル リポジトリに追加します。

$ git remote add origin <url://to/source/repository

以下に示すように、必要なコミットを取得できるようになりました。

$ git fetch origin <sha1-of-commit-of-interest>

ブランチを目的のコミットにリセットして、プロセスを終了します。

$ git reset --hard FETCH_HEAD

これにより、指定されたコミットを含む完全なコミット履歴が取得されることに注意してください。 これは --depth=...' または '--shallow-since=... フラグで制限できます。

この方法は安全ではなく、すべての Git サーバーで機能するとは限りません。 同じ宛先に到着するこの方法の代替手段はありますか?

これから説明する方法は、小さなリポジトリに最適です。 大規模なリポジトリでも機能しますが、忍耐が必要です。

クローン元のコミットが既にわかっている場合は、リポジトリ全体のクローンを作成することから始めます。

以下に示すように、リモートをローカルリポジトリに追加することから始め、クローンに進みます。

$ git clone <repo url>

完了したら、以下に示すように、git reset コマンドを使用して、HEAD を目的のコミットに移動します。

$ git reset --hard <commit id>

最新のコミットに戻りたい場合は、git pull コマンドを実行します。

または、以下に示すように、リポジトリのクローンを作成し、git checkout コマンドを使用して目的のコミットに切り替えることもできます。

$ git clone <repo url>

コミットに切り替えるには:

$ git checkout <commit id>

以下に示すように、切り離された HEAD モードで git reset コマンドを実行します。

$ git reset --hard

このアプローチは、ブランチの内容を変更せずにコードをいじりたい場合に理想的です。

git switch - コマンドを実行して、切り離された HEAD モードを終了します。

結論として、Bitbucket などの一部の Git サーバーでは、到達可能なコミットから取得できます。 uploadpack.allowReachableSHA1InWant 機能を利用するには、Git バージョン 2.5+ が必要です。これにより、git fetch origin <commit-of-interest> コマンドを実行できるようになります。

同じ目的地に到着する他の代替手段についても説明しました。