1. ホーム
  2. ギット

[解決済み】リモート Git リポジトリから特定のコミットを取得する

2022-05-10 13:57:40

質問

リモート Git リポジトリを自分の PC にクローンすることなく、特定のコミットだけを取得する方法はありますか? リモート リポジトリの構造は私のものとまったく同じであり、したがって、競合は発生しませんが、これを行う方法がまったくわかりませんし、その巨大なリポジトリをクローンしたくありません。

私はgitに新しいです、何か方法はありますか?

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

Git バージョン 2.5+ (Q2 2015) からは、単一のコミットを (フルリポジトリをクローンせずに) フェッチすることが実際に可能になりました。

以下を参照してください。 コミット 68ee628 によって フレドリック・メドレー ( moroten ) , 2015年5月21日。

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット a9d3493 , 2015年06月01日) にあります。

これで、新しいコンフィグ(サーバー側)ができました。

uploadpack.allowReachableSHA1InWant

許可する upload-pack は、任意の ref tip から到達可能なオブジェクトを要求するフェッチ要求を受け入れることを許可します。しかし、オブジェクトの到達可能性を計算するのは計算量が多いことに注意してください。

デフォルトは false .

そのサーバーサイドの設定と浅いクローンを組み合わせると( git fetch --depth=1 ) を使えば、単一のコミットを要求することができます ( t/t5516-fetch-push.sh :

git fetch --depth=1 ../testrepo/.git <full-length SHA1>

を使うことができます。 git cat-file コマンドを使用すると、コミットが取得されたことを確認できます。

git cat-file commit <full-length SHA1>

" git upload-pack "を提供するものです。 git fetch を提供する " を指定することができます。 どの ref の先端にもないコミットでも、それが で、どの参照からも到達可能であれば uploadpack.allowReachableSHA1InWant 設定変数で指定します。

が指摘するように マット コメント :

<ブロッククオート

SHA は省略されていない完全な SHA でなければならないことに注意しましょう。そうしないと、Git はコミットを見つけることができなかったと主張します。


完全なドキュメントは

upload-pack : オプションで到達可能な sha1 の取得を許可します。

<ブロッククオート

とは uploadpack.allowReachableSHA1InWant の設定オプションがサーバ側で設定されている場合、 " git fetch " は、宣伝されていない (帯域外またはサブモジュールのポインタから取得された可能性が高い) オブジェクトを指定する "want" 行を持つリクエストを作ることができます。

ブランチの先端から到達可能なオブジェクトのみ、つまりアドバタイズされたブランチと transfer.hideRefs によって隠された枝の和であり、処理されます。

到達可能性を確認するために履歴を遡らなければならないという関連コストがあることに注意してください。

この機能は、あるコミットの内容を取得するときに使用できます。 を取得するときに使用できます。 リポジトリ全体をクローンすることなく、特に浅いフェッチが使用されている場合に使用できます。 .

便利なケースは、例えば

  • 履歴に大きなファイルを含むリポジトリ。
  • サブモジュールのチェックアウトに必要なデータのみをフェッチする。
  • どのブランチに属しているかを正確に伝えることなく sha1 を共有する場合、および Gerrit において変更数ではなくコミット数で考える場合。

    (Gerritの場合は、すでに allowTipSHA1InWant を通して解決されています)

Git 2.6 (2015年第3四半期) では、そのモデルが改善される予定です。

参照 コミット 2bc31d1 , コミット cc118a6 (2015年7月28日)によって ジェフ・キング ( peff ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット 824a0be , 2015年8月19日)

refs サポート 否定的 transfer.hideRefs

<ブロッククオート

を使用して参照階層を非表示にした場合。 transfer.hideRefs で非表示にした場合、後でその設定を上書きして "unhide" する方法はありません。

このパッチは、別のマッチがそれを隠す場合でも、マッチを直ちに非表示としてマークさせる "negative"隠すを実装しています。

これにより、通常の "last one wins" 設定優先順位が機能するようになります (そして、 のエントリは、 と呼ばれます)。 .git/config は、例えば /etc/gitconfig ).

というわけで、できるようになりました。

git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'

を隠す refs/secret をすべてのレポで、ある特定のレポの公開ビットを除いて を、特定のレポで隠すことができます。


Git 2.7 (2015年11月/12月) で再び改善される予定です。

参照 コミット 948bfa2 , コミット 00b293e (2015年11月05日)を参照してください。 コミット 78a766a , コミット 92cab49 , コミット 92cab49 , コミット 92cab49 (2015年11月03日)を参照してください。 コミット 00b293e , コミット 00b293e (2015年11月05日)、および コミット 92cab49 , コミット 92cab49 , コミット 92cab49 , コミット 92cab49 (2015年11月03日)によって Lukas Fleischer ( lfos ) .

ヘルプドバイ エリック・サンシャイン ( sunshineco ) .

(によって統合されました。 ジェフ・キング peff -- コミット dbba85e , 2015年11月20日)。

config.txt のセマンティクスを文書化したものです。 hideRefs を名前空間とする

<ブロッククオート

今のところ、どのように transfer.hideRefs がどのように振る舞うべきかという明確な定義はありません。 がどのように動作するかの明確な定義はありません。

説明すると hideRefs の接頭辞はその場合、ストリップされた名前と一致します。このように hideRefs パターンが現在 が処理される方法です。

<ブロッククオート

hideRefs: 完全参照のマッチングのサポートを追加しました。

ストリップされた参照へのマッチングに加えて hideRefs パターンを追加し、完全な (ストリップされていない) 参照をマッチさせることができるようになりました。

ストリップされたものと完全なものとを区別するために、これらの新しいパターンには プレフィクスとして円記号 ( ^ ).

したがって 新しいドキュメント :

transfer.hideRefs:

名前空間が使用されている場合、名前空間プレフィックスは各参照から取り除かれてから transfer.hiderefs パターンにマッチします。

例えば、もし refs/heads/master で指定されている場合 transfer.hideRefs であり を指定すると、現在の名前空間は foo であり、次に refs/namespaces/foo/refs/heads/master は広告から省かれますが refs/heads/masterrefs/namespaces/bar/refs/heads/master は、今でもいわゆる 行として宣伝されています。

ストリップする前に参照にマッチさせるために ^ の前に を追加します。もしあなたが !^ , ! を先に指定する必要があります。


R.. 言及 コメントで 設定 uploadpack.allowAnySHA1InWant であり、これによって upload-pack を受け入れることができます。 fetch リクエストを受け入れるようにします。(デフォルトは false ).

参照 コミット f8edeaa (2016年11月、Git v2.11.1)によるものです。 David "novalis"ターナー ( novalis ) :

upload-pack : オプションで任意の sha1 を取得することができます。

<ブロッククオート

の場合、到達可能性チェックを行うのは少し馬鹿げているように思えます。 ユーザーがリポジトリ内の絶対的なすべてにアクセスすることを信頼する場合、到達性チェックを行うのは少し馬鹿げているようです。

また、分散システムにおいては、それは無作法です。 あるサーバーが参照元をアドバタイズし、別のサーバーがその参照元をフォースプッシュした場合。 おそらく、2 つの HTTP リクエストは、これらの異なるサーバーに向けられることになるでしょう。 サーバーに向けられることになります。


Git 2.34 (2021年第4四半期) で、"。 git upload-pack " ( ) の反対側で実行される git fetch ( ) は、want-ref リクエストを処理するときに ref 名前空間を考慮することを忘れていました。

参照 コミット 53a66ec , コミット 3955140 , コミット bac01c6 (2021 年 8 月 13 日) によるものです。 キム・アルティントップ ( kim ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット 1ab13eb 2021年9月10日)

docs : transfer.hideRefs と名前空間の相互作用を明確にする。

署名: Kim Altintop


レビュー執筆者:Jonathan Tan

<ブロッククオート

のドキュメントにある名前空間についてのセクションを拡張してください。 transfer.hideRefs との微妙な違いを指摘するために upload-packreceive-pack .

3955140 (" upload-pack.c : want-ref を名前空間に対して相対的に扱う", 2021-07-30, Git v2.34.0 --。 マージ に記載されている バッチ #5 を教えました。 upload-pack を拒否する want-ref を拒否することに言及されました。

隠された参照の名前は決して明らかにされませんが、それが指すオブジェクトIDは明らかにされるかもしれないことが明らかにされています。

git config に含まれるようになりました。 を追加しました。 :

<ブロッククオート

に対してマッチする前に transfer.hiderefs のパターンがあります。パターン ストリップする前に参照にマッチさせるために ^ を加えます。もし を組み合わせると !^ , ! を先に指定する必要があります。

git config に含まれるようになりました。 を追加しました。 :

<ブロッククオート

が省略された広告が表示されます。もし uploadpack.allowRefInWant が設定されている場合は upload-packwant-ref refs/heads/master をプロトコル v2 の fetch コマンドのように refs/namespaces/foo/refs/heads/master が存在しないかのようなコマンドです。 receive-pack は、一方では、名前に言及することなく、まだ は、その名前に言及することなく、参照先のオブジェクトIDを宣伝します(いわゆる "。 .hav e"行)。