web-dev-qa-db-ja.com

リモートリポジトリから単一のタグを取得する

このコマンドはallタグを取得します:

git fetch Origin --tags

このコマンドは、特定のタグを取得します。

git fetch Origin refs/tags/1.0.0

しかしそれは私をさせない:

git checkout tags/2.3.18

単一のタグを取得してからチェックアウトを実行するにはどうすればよいですか?

17
aleclarson

git fetch Origin refs/tags/1.0.0

ローカル参照を書き込まないため、これは失敗します。リモートのrefs/tags/1.0.0、およびそれに伴う必要なタグオブジェクト、コミットなどを取得します。これらはFETCH_HEADにドロップされます(すべてのgit fetchコマンドが常に行うように)。以上です。 yourリポジトリに参照refs/tags/1.0.0を作成することはありませんが、必要なすべてを取得しました。

まだ存在しない場合にそのようなタグを作成するには:

git fetch Origin refs/tags/1.0.0:refs/tags/1.0.0

コロンの右側の名前は、Gitがリポジトリで使用する名前です。たとえば、refs/heads/wackyという名前を付けることで、このタグをwackyという名前のブランチに変えることができます。 (これを行う理由はありません。説明のためだけに説明しています。)

これは強制的なフェッチではないため、すでにhave a refs/tags/1.0.0を使用している場合、Gitは参照の更新を拒否します。既存の1.0.0タグを上書きする場合は、次を使用します。

git fetch Origin +refs/tags/1.0.0:refs/tags/1.0.0

上書きの有無にかかわらず、すべてのタグを取得する場合:

git fetch Origin 'refs/tags/*:refs/tags/*'

先行プラス記号の有無にかかわらず。 (注:引用符は、シェルから*を保護するためのものです。プラス記号は、引用符の内側または外側に配置できます。実際、引用符自体は、すべてのアスタリスクまたは他のシェルを囲む限り、どこにでも配置できますメタ文字:

refs/tags/'*:refs/tags/*'

または、代わりにバックスラッシュを使用できます:

refs/tags/\*:refs/tags/\*

すべての場合において、シェルの「アスタリスクはおいしいので、食べましょう」機能から敏感なアスタリスクを保護しています。

30
torek

私はすべての答えを読みましたが、まだ一つの構文糖について言及されていません。 (後でチェックアウトするために)タグとして1つのタグのみを取得する必要がある場合は、たとえば_refs/tags/2.3.18_のように記述できます。

_git fetch Origin tag 2.3.18 --no-tags
_

これはすでに述べたショートカットです:

_git fetch Origin refs/tags/2.3.18:refs/tags/2.3.18 --no-tags
_

もちろん、(デフォルトの動作による)他のタグが必要な場合、またはcloneコマンドまたはtagOptで_--no-tags_を明示的に設定している場合は、_--no-tag_を使用できません設定オプション(_man git-clone_)。

_git fetch Origin tag 2.3.18
_
2
Olleg

git fetchに明示的な参照を指定する場合、 refspec でマッピングを提供するか、FETCH_HEADに記録されたフェッチ済みIDで必要な処理を行う必要があります。

マッピングされていないケースがフェッチされたrefでデフォルトの処理を行わないことの利点は、マッピングされていないケースがフェッチされたrefでデフォルトの処理を行わないことです。感謝するかもしれない

git fetch Origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>

ローカルリポジトリに設定するタグは1つだけで、Originリポジトリにある何十もの以前のタグではなく、フェッチした履歴を設定したい場合。

2
jthill