1. ホーム
  2. ギット

[解決済み】「git fetch --tags」は「git fetch」を含みますか?

2022-04-19 05:40:16

質問

素朴な疑問なのですが、quot;git fetch"の関数は git fetch --tags ?

つまり、もし私が git fetch --tags をすぐに実行する理由はあるのでしょうか? git fetch を直後から実行するのですか?

についてはどうでしょうか。 git pullgit pull --tags ? 同じ状況?

解決方法は?

git 1.9/2.0 (2014年第1四半期) , git fetch --tags タグを取得する に加えて は、オプションなしで同じコマンドラインによって取得されるものです。

タグのみを取得する。

git fetch <remote> 'refs/tags/*:refs/tags/*'

詳細には

参照 コミット c5a84e9 によって マイケル・ハガティ(mhagger) :

前回までのfetchの" --tags "オプションは、refspecを指定することと同等と見なされていました。

refs/tags/*:refs/tags/*

をコマンドラインで実行した。 特に remote.<name>.refspec の設定は無視されました。

しかし、他の参照も取得せずにタグを取得することはあまり有益ではありません、一方、それは タグを取得できるのは非常に便利です。 に加えて 他のリファレンス

そこで、このオプションのセマンティクスを変更し、後者を行うようにします。

を取得したい場合 のみ タグを明示的に指定することが可能です。

git fetch <remote> 'refs/tags/*:refs/tags/*'

1.8.0.3 以前のドキュメントでは、" のこの側面について曖昧であったことに注意してください。 fetch --tags という挙動になります。

コミット f0cb2f1 (2012-12-14) fetch --tags ドキュメントを古い動作に合わせるようにした。

このコミットでは、新しい動作に合わせてドキュメントを変更します ( Documentation/fetch-options.txt ).

すべてのタグをリモートから取得するよう要求する に加えて、他のすべてのものを取得します。 .


Git 2.5(2015年第2四半期)以降 git pull --tags はより堅牢です。

参照 コミット 19d122b によって ポール・タン ( pyokagan ) , 2015年5月13日。

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

<ブロッククオート

pull : 削除 --tags マージ候補がない場合のエラー

以来 441ed41 (" git pull --tags ": error out with a better message, 2007-12-28, Git 1.5.4+), git pull --tags の場合、別のエラーメッセージが表示されます。 git-fetch がマージ候補を返さなかった場合。

It doesn't make sense to pull all tags; you probably meant:
      git fetch --tags

というのも、その当時は git-fetch --tags は、すべての が設定されているため、マージ候補が存在しない。そのため、混乱を防ぐためにこのエラーメッセージが導入されました。

しかし c5a84e9 ( fetch --tags : フェッチタグ に加えて 他のもの、2013-10-30、Git 1.9.0+)。 git fetch --tags に加えて、タグを取得することになります。 に加えて、設定されているすべての refspecs を指定します。

したがって、マージ候補がない状況が発生した場合、その原因は --tags が設定されました。そのため、この特別なエラーメッセージは、現在では無関係です。

混乱を避けるため、このエラーメッセージを削除してください。


Git 2.11+(2016年第4四半期)使用時 git fetch が早くなりました。

参照 コミット 5827a03 (2016年10月13日)によるものです。 ジェフ・キング ( peff ) .

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

<ブロッククオート

fetch : "quot"を使用します。 has_sha1_file 以下のタグの場合

<ブロッククオート

フォローするブランチとは無関係な多くのタグを持つリモートからフェッチするとき、タグが指すオブジェクト(フェッチするつもりはない!)がリポジトリに存在するかどうかを慎重にチェックするために、あまりにも多くのサイクルを浪費してきました。

このパッチは、フェッチにHAS_SHA1_QUICKを使用するように教え込みます。 を使うかもしれない場合、スピードのために精度を上げる必要があります。 同時リパック

以下は、付属のperfスクリプトで、上記と同様の状況を設定した結果です。

Test            HEAD^               HEAD
----------------------------------------------------------
5550.4: fetch   11.21(10.42+0.78)   0.08(0.04+0.02) -99.3%

という状況にのみ適用されます。

  1. クライアント側で多くのパックを作成して reprepare_packed_git() が高価になります (最も高価な部分は、ソートされていないリストで重複を見つけることで、これは現在二次的なものです)。
  2. サーバー側で自動追従の候補となる(つまりクライアントが持っていない)タグ参照を大量に必要とする。 そのたびにパックディレクトリの再読込が発生します。
  3. 通常であれば、クライアントはそれらのタグを自動追尾し、1回の大きなフェッチの後、(2)はもはや真ではありません。

    しかし、これらのタグが、クライアントがフェッチするものとは切り離された履歴を指している場合、自動追跡は行われず、これらの候補はフェッチのたびに影響を及ぼします。

Git 2.21(2019年2月)では、リグレッションが発生したようで、その際に コンフィグ remote.origin.fetch ではない デフォルトの ( '+refs/heads/*:refs/remotes/origin/*' )

fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed


Git 2.24(2019年第4四半期)では、別の最適化が追加されました。

参照 コミットb7e2d8b (2019年9月15日)による 鈴木雅也さん( draftcode ) .

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

<ブロッククオート

fetch 使用 oidset より速く検索するために必要なOIDを保持するために

<ブロッククオート

期間中 git fetch を使用すると、クライアントは、広告されたタグのOIDがフェッチリクエストのウォントOIDセットに既にあるかどうかをチェックします。

このチェックはリニアスキャンで行われる。

多くのrefを持つリポジトリでは、このスキャンを繰り返すと15分以上かかります。

これを高速化するために oid_set を他のrefのOIDのために使用します。