1. ホーム
  2. git

GitとMercurialを使った部分的なクローン

2023-12-11 09:44:22

質問

Git や Mercurial で、一つのブランチ(あるいは指定したコミット)のみをクローンすることは可能でしょうか。つまり、中央のレポをクローンしたいのですが、巨大なので、その一部だけを取得し、それでも自分の変更をコントリビュートバックできるようにしたいのです。それは可能ですか?例えば、私はタグ130以降だけが欲しい、またはそのようなものですか?

もしそうなら、どのように?

どのように解決するのですか?

Gitの世界では、3種類の部分クローンについて話しているのです。

  • 浅いクローン。 リビジョンポイントX以降の履歴が欲しいです。

    使用する git clone --depth <n> <url> を使ってください。しかし、浅いクローンは他のリポジトリとやりとりする際にいくらか制限されることを覚えておいてください。 パッチを生成し、電子メールで送信することができるようになります。

  • ファイルパスによる部分クローン。 私はいくつかのディレクトリにすべてのリビジョン履歴が欲しい /path .

    不可 をGitで使うことができます。 しかし、最近のGitでは スパースチェックアウト つまり、全履歴を持ちながら、全ファイルのサブセットだけをチェックアウトする(作業領域に置く)ことができるのです。

  • 選択されたブランチのみをクローンします。 1つのブランチ(またはブランチの選択されたサブセット)のみをクローンしたいのですが。

    可能であり

    git 1.7.10 以前では簡単ではありません。clone が行うことを手動で行う必要があります。 git init [<directory>] そして git remote add origin <url> を編集します。 .git/config 置換 *remote.origin.fetch をリクエストされたブランチ (おそらく 'master') で実行します。 git fetch .

    git 1.7.10 時点で git clone --single-branch オプションがありますが、これはこの目的のために追加されたようなもので、かなり簡単なようです。

    しかし、ブランチは通常その歴史のほとんどを共有しているので、ブランチのサブセットのみをクローンすることによる利益は、あなたが考えているよりも小さいかもしれないことに注意してください。

選択したブランチのサブセットのみの浅いクローンを作成することもできます。

もし、人々がファイルパスによってどのように物事を分解したいか (同じリポジトリ内の複数のプロジェクト) がわかっているなら、サブモジュール (svn:externals のようなもの) を使って、レポを個別にクローンできる部分にあらかじめ分割しておくことができます。