素晴らしくて単純な質問-「gitfetch」の関数は?の厳密なサブセットgit fetch --tags
ですか?
つまり、私が走った場合git fetch --tags
、すぐにすぐに走る理由はありgit fetch
ますか?
git pull
とはどうgit pull --tags
ですか?同じ状況?
注:git 1.9 / 2.0(2014年第1四半期)以降、オプションなしで同じコマンドラインによってフェッチされるものに加えてgit fetch --tags
タグをフェッチします。
タグのみを取得するには:
git fetch <remote> 'refs/tags/*:refs/tags/*'
詳細に:
Michael Haggerty(mhagger)によるcommitc5a84e9を参照してください。
以前は、fetchの"
--tags
"オプションはrefspecを指定することと同等であると見なされていましたrefs/tags/*:refs/tags/*
コマンドラインで; 特に、
remote.<name>.refspec
構成が無視される原因になりました。ただし、他の参照をフェッチせずにタグをフェッチすることはあまり役に立ちませんが、他の参照に加えてタグをフェッチできることは非常に便利です。 したがって、後者を行うには、このオプションのセマンティクスを変更してください。
ユーザーがタグのみをフェッチしたい場合でも、明示的な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
はより堅牢であるため、次のようになります。
2015年5月13日、Paul Tanによるコミット19d122bを参照してください。 ( 2015年5月22日、コミットcc77b99でJunio CHamanoによってマージされました)pyokagan
gitster
pull
--tags
:マージ候補がない場合のエラーを削除
441ed41 ( " ":より良いメッセージでエラーアウト。、2007-12-28、Git 1.5.4+)以降、マージ候補が返されない場合は、別のエラーメッセージが 出力されます。
git pull --tags
git pull --tags
git-fetch
It doesn't make sense to pull all tags; you probably meant: git fetch --tags
これは、その時点で、
git-fetch --tags
構成されたrefspecをオーバーライドするため、マージ候補がないためです。したがって、混乱を防ぐためにエラーメッセージが導入されました。ただし、c5a84e9(
fetch --tags
:他のものに加えてタグをフェッチ 、2013-10-30、Git 1.9.0+)は、git fetch --tags
構成されたrefspecに加えてタグをフェッチするためです。
したがって、マージ候補が発生しない場合は、--tags
が設定されているためではありません。そのため、この特別なエラーメッセージは現在は無関係です。混乱を防ぐために、このエラーメッセージを削除してください。
Git 2.11+(2016年第4四半期)git fetch
を使用すると、より高速になります。
Jeff King()によるcommit 5827a03(2016年10月13日)を参照してください。( Junio C Hamanoによってマージされました---コミット9fcd144 、2016年10月26日)peff
gitster
fetch
has_sha1_file
:タグフォローに「quick」を使用
フォローしているブランチに関係のないタグが多数あるリモートからフェッチする場合、タグが指すオブジェクト(フェッチしない!)がリポジトリに存在するかどうかを確認するときに、多くのサイクルを浪費していました。慎重すぎる。
このパッチは、同時再パックで際どい可能性がある場合に、速度のために精度を犠牲にするためにHAS_SHA1_QUICKを使用するようにフェッチを教えています。
含まれているperfスクリプトの結果は次のとおりです。これは、上記と同様の状況を設定します。
Test HEAD^ HEAD ---------------------------------------------------------- 5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
これは、次のような状況にのみ適用されます。
- クライアント側には、高価にするためのパックがたくさんあります
reprepare_packed_git()
(最も高価な部分は、現在2次式であるソートされていないリストで重複を見つけることです)。- 自動フォローの候補である(つまり、クライアントが持っていない)サーバー側に多数のタグ参照が必要です。それぞれがパックディレクトリの再読み取りをトリガーします。
- 通常の状況では、クライアントはこれらのタグを自動フォローし、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四半期)は別の最適化を追加します。
鈴木正也()によるcommit b7e2d8b(2019年9月15日)を参照してください。( Junio C Hamanoによってマージされました---コミット1d8b0df、2019年10月7日)draftcode
gitster
fetch
:oidset
検索を高速化するために必要なOIDを保持するために使用
の間
git fetch
に、クライアントは、アドバタイズされたタグのOIDがフェッチ要求の必要なOIDセットにすでに含まれているかどうかを確認します。
このチェックは線形スキャンで行われます。
参照が多いリポジトリの場合、このスキャンを繰り返すには15分以上かかります。これを高速化するには
oid_set
、他の参照のOID用にを作成します。
注:この回答は、gitv1.8以前でのみ有効です。
これのほとんどは他の回答やコメントで述べられていますが、ここに簡潔な説明があります:
git fetch
すべてのブランチヘッド(またはremote.fetch configオプションで指定されたすべて)、それらに必要なすべてのコミット、およびこれらのブランチから到達可能なすべてのタグをフェッチします。ほとんどの場合、すべてのタグはこの方法で到達可能です。git fetch --tags
すべてのタグをフェッチし、それらに必要なすべてのコミットを取得します。フェッチされたタグから到達可能であっても、ブランチヘッドは更新されません。概要:フェッチのみを使用して完全に最新の状態にしたい場合は、両方を実行する必要があります。
また、コマンドラインで入力するという意味でない限り、「2倍遅い」わけではありません。その場合、エイリアスによって問題が解決されます。2つの要求は異なる情報を要求しているため、2つの要求を行う際のオーバーヘッドは基本的にありません。
私はこれに自分で答えるつもりです。
違いがあると判断しました。「gitfetch--tags」はすべてのタグを取り込む可能性がありますが、新しいコミットは取り込みません。
完全に「最新」にするためにこれを行う必要があることがわかりました。つまり、マージせずに「gitpull」を複製しました。
$ git fetch --tags
$ git fetch
2倍遅いので、これは残念です。「gitfetch」だけに、通常どおりに実行してすべてのタグを取り込むオプションがあった場合。
ここでの一般的な問題は、git fetch
をフェッチすること+refs/heads/*:refs/remotes/$remote/*
です。これらのコミットのいずれかにタグがある場合、それらのタグもフェッチされます。ただし、リモートのどのブランチからも到達できないタグがある場合、それらはフェッチされません。
この--tags
オプションは、refspecをに切り替えます+refs/tags/*:refs/tags/*
。あなたは両方をつかむように頼むことができます。git fetch
次のコマンドを使用するだけで、必ず実行git fetch && git fetch -t
できます。
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
また、これをこのリポジトリのデフォルトにしたい場合は、デフォルトのフェッチに2番目のrefspecを追加できます。
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
これにより、このリモコンのに2fetch =
行目が追加されます。.git/config
私はプロジェクトのためにこれを処理する方法を探してしばらく過ごしました。これが私が思いついたものです。
git fetch -fup origin "+refs/*:refs/*"
私の場合、これらの機能が必要でした
refs/*:refs/*
+
refspecの前に、ローカルブランチとタグを非早送りで上書きします-u
-p
-f
ほとんどの場合、git fetch
必要なことを実行する必要があります。つまり、「リモートリポジトリから新しいものを取得し、ローカルブランチにマージせずにローカルコピーに配置します」。 git fetch --tags
新しいタグ以外は何も取得しないことを除いて、まさにそれを行います。
その意味で、git fetch --tags
は決してのスーパーセットではありませんgit fetch
。実際、それは正反対です。
git pull
もちろん、はのラッパーにすぎませんgit fetch <thisrefspec>; git merge
。そもそも何をしているのかを理解するのに役立つという理由だけで、ジャンプする前に手動git fetch
でingとingを行うことに慣れることをお勧めします。git merge
git pull
git pull
そうは言っても、関係はとまったく同じgit fetch
です。 git pull
のスーパーセットですgit pull --tags
。
git fetch upstream --tags
正常に動作し、新しいタグのみを取得し、他のコードベースは取得しません。