リモートのGitリポジトリから特定のコミットだけを、PCでクローンせずに取得する方法はありませんか?リモートレポの構造は私のレポと全く同じなので、コンフリクトすることはありませんが、どうすればいいのか見当がつきませんし、あの巨大なリポジトリをクローンしたくはありません。
私はgitの初心者ですが,何か方法はありますか?
クローンは一度しか作らないので、すでにリモートリポジトリのクローンがある場合は、そこからプルしてもすべてを再度ダウンロードすることはありません。プルしたいブランチを指定するか、変更点を取得して必要なコミットをチェックアウトするだけです。
新しいリポジトリからの取得は、あなたが持っていない変更点のみをダウンロードするので、帯域幅が非常に安くなります。Gitが正しいことを最小限の負荷で行うという観点から考えてみましょう。
Gitはすべてを.git
フォルダに保存します。コミットは単独で取得して保存することはできず、すべての先祖が必要です。それらは相互に関連しています。
しかし、ダウンロードサイズを小さくするために、特定のブランチやコミットに関連するオブジェクトだけを取得するよう git に指示することができます。
git fetch origin refs/heads/branch:refs/remotes/origin/branch
これは、リモートブランチ branch
に含まれるコミットだけをダウンロードし、それを origin/branch
に保存します。その後、マージやチェックアウトができます。
また、SHA1コミットのみを指定することもできます。
git fetch origin 96de5297df870:refs/remotes/origin/foo-commit
これにより、指定したSHA-1 96de5297df870(および見逃したその先祖)のコミットのみをダウンロードし、(存在しない)リモートブランチ origin/foo-commit
に保存します。
リモートリポジトリの単一のコミットを取得するには、単純に
git fetch <repo> <commit>
といったところです。
<repo>
は、リモートレポの名前(例:origin
)またはリモートレポのURL(例:https://git.foo.com/myrepo.git
)です。<commit>
にはSHA1コミットを指定します。例えば、以下のようになります。
git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545
コミット(および失われた祖先)を取得した後は、次のようにしてチェックアウトできます。
git checkout FETCH_HEAD
この方法では "detached head" の状態になることに注意してください。