Gitで特定のタグをダウンロードする


1941

私は、Gitリポジトリの特定のタグをダウンロードする方法を理解しようとしています。これは、現在のバージョンの1つ前のバージョンです。

以前のバージョンのタグがgit Webページにあり、何か長い16進数のオブジェクト名が付いているのがわかりました。

ただし、Tagged release 1.1.5サイトによるとバージョン名は「」です。

私は次のようなコマンドを試しました(名前を変更しました)。

git clone http://git.abc.net/git/abc.git my_abc

そして、私は何かを得ました-ディレクトリ、サブディレクトリの束など

リポジトリ全体である場合、探しているバージョンを取得するにはどうすればよいですか?そうでない場合、その特定のバージョンをダウンロードするにはどうすればよいですか?


11
私はプロダクションとは完全に異なるリポジトリで開発しているので、git checkoutを使用しようとしたときに、プロダクションはタグを知りませんでした。解決策は、「git pull --tags」を使用してから、git checkoutを使用することでした。
エンタープライズアーキテクト

11
「git fetch --tags」も機能します
John Erck

16
リポジトリ全体のクローンを作成してからタグに切り替えることを回避するには、直接を実行しclone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abcます。もちろん、これは同じ名前のブランチがない場合にのみ機能します(方法論によっては、これが発生することはありません)。
RedGlyph 2013年

3
@RedGlyphありがとうございます。そうでなければ、私たちはこのようにすることができます。git checkout -b new-branch tag-name。次に、新しいブランチのクローンを作成します。いつでも新しいブランチを削除できます。
kalidasan 2013

回答:


2871
$ git clone

リポジトリ全体が表示されます。

クローンの後で、タグをリストし$ git tag -l、特定のタグをチェックアウトできます。

$ git checkout tags/<tag_name>

さらに良いのは、ブランチをチェックアウトして作成することです(そうしないと、タグのリビジョン番号にちなんで名前が付けられたブランチになります):

$ git checkout tags/<tag_name> -b <branch_name>

15
うん。gitはこの点でsubversionとは異なります。svnタグは基本的にファイルを新しいフォルダーにコピーするため、特定のファイルの束をsvnチェックアウトできますが、gitタグは特定のリビジョンへのポインターです。
2009

5
同じ名前のブランチとタグがある場合はどうなりますか?「git checkout <name>」とだけ言うと、「警告:refname '<name>'があいまいです。ブランチ '<name>'に切り替えました」-代わりにタグに切り替えるように指示するにはどうすればよいですか?
MatrixFrog 2010年

54
チェックアウトを行うと、Derekが述べたように、リポジトリは「ヘッドが切り離された」状態になります。代わりに、追加-bの新しいブランチを作成し、ブランチ名を指定するには、gitのを伝えるフラグ:git checkout <tag_name> -b <branch_name>
hellatan

22
@hellatan実際にブランチを作成する場合にのみこれを行う必要がありますが、ほとんどの場合は作成しません。「切り離されたヘッド」状態で実行しても問題はありません。gitの履歴を確認したいだけであれば、おそらくあなたが望んでいることと同じです。
machineghost 2013

4
gitバージョン1.8.3.5以降では、repo HEADとして--branch <tag ref>自分でリポジトリをダウンロードできます<tag ref>。と組み合わせると--depth 1、浅いタグのチェックアウトが行われます。stackoverflow.com/a/21699307/1695680を
ThorSummoner 2014年

409
git clone --branch my_abc http://git.abc.net/git/abc.git

リポジトリを複製して、興味のあるタグをそのまま残します。

1.8.0のgitクローンの状態に関するドキュメント。

--branchはタグを取得して、結果のリポジトリのコミット時にHEADをデタッチすることもできます。


7
これは(少なくとも今は)タグに対しては機能しますが、最終的には切り離されたHEAD状態になります。
mxcl 2013年

72
参考:--depth 1現在以外のコミットをダウンロードしないように指定してください。
Acumenus 2014年

4
これは実際にタグで機能しませ。枝だけ。編集:gitの新しいバージョンのみがサポートしているようです。
lzap 14

また、.git / configを編集して(または何らかの方法で構成して)、2つ以上のタグのシャロークローンを作成することもできます。必要に応じて、シャロークローンをフルクローンにアップグレードするなど
Sam Watkins

タグと一緒に必要なブランチを指定することもできます。git clone --branch my_abc http://git.abc.net/git/abc.git -b quality品質と同様に、私たちが望むブランチの名前です。
hazimdikenli

180

デプロイのために特定のタグのみをチェックアウトするために、私は例を使用します:

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

これは、完全なリポジトリではなく最新のコードのみに関心がある場合、リモートリポジトリからコードをチェックアウトする最も速い方法のようです。このように、「svn co」コマンドに似ています。

注:Gitマニュアルによれ--depthフラグを渡すこと--single-branchはデフォルトで意味します。

-深さ

指定したコミット数に切り捨てられた履歴を持つ浅いクローンを作成します。すべてのブランチの先端付近の履歴をフェッチするために--no-single-branchが指定されていない限り、-single-branchを意味します。サブモジュールを浅くクローンしたい場合は、-shallow-submodulesも渡してください。


10
その複雑さは信じられません。自分のコードが他の人に使用されることを誰も期待していないと思います。
ベン

9
@ベン、これは実際には最も簡単な解決策です(単一のコマンドが必要です)
Eliran Malka

3
@ベンはなぜこれが複雑なのですか?これは、デフォルトとは異なる方法で実行したいいくつかの機能を備えた特別なユースケースです。もちろん、それを指定する必要があります。通常の解決策は、分散 vcsでリポジトリ全体をチェックアウトすることです。
erikbwork

9
@ベンは正しいです。gitは複雑なafであり、数年前にLinusによって書かれました、そして彼はそれがどのように機能するかを「本当に」理解している唯一の人です。xkcd.com/1597
RyanNerd

11
--depth nを意味し--single-branchます。両方は必要ありません。
Niyaz、2018年

98

私はgitの専門家ではありませんが、これでうまくいくと思います。

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

または

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

2番目のバリエーションは、タグに基づいて新しいブランチを確立します。これにより、「デタッチされたHEAD」を回避できます。(git-checkoutマニュアル)

すべてのgitリポジトリにはリビジョン履歴全体が含まれているため、リポジトリのクローンを作成すると、最新のコミットに加えて、探しているタグを含めて、以前のすべてにアクセスできます。


4
THX。git checkout -b b1.5.0 v1.5.0「gh-pages」ブランチ内のバージョンをチェックアウトするときに、Githubページに正常にプッシュするために使用する必要がありました。私が書いたこの要旨
Chris Jacob

4
ブランチをチェックアウトする前cdabc/最初に入らなければならないので、これは完全に正確ではないと思います(たとえば、ターミナルに貼り付けるため)
Steven Lu

@StevenLuもちろんあなたは正しいです。私はカットアンドペーストではなくコンセプトを求めていましたが、それは可能な限り正確かもしれません。を追加しましたcd
grossvogel 2014

81

gitアーカイブを使用して、特定のタグまたはコミットIDのtarボールをダウンロードできます。

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

タグのzipアーカイブをエクスポートすることもできます。

  1. タグのリスト:

    git tag
    
    0.0.1
    0.1.0
    
  2. タグをエクスポートする:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. ノート:

    • 形式を指定する必要はありません。出力ファイル名でピックアップされます。
    • 接頭辞を指定すると、コードがディレクトリにエクスポートされます(末尾にスラッシュを含める場合)。

3
このコマンドは、サブモジュールとの仕事は、見ていないstackoverflow.com/questions/1591387/...を
Zitrax

3
ただし、gitアーカイブではバージョン管理も削除されるため、次のgitチェックアウトを行って次のタグにアップグレードすることはできません。
idbrii

9
はい、バージョン管理を失いますが、git cloneと比較してgitアーカイブが節約する時間は絶対に信じられません!+1
MarcH 2013年

これは、git archive私がやりたいことに非常に近いですが、パブリックリポジトリからダウンロードするだけの場合にパスワードを要求されるという点が異なります。sshではなくhttpを使用するにはどうすればよいですか?
robru

1
これはfatal: Operation not supported by protocol.Unexpected end of command streamエラーで失敗します。または、fatal: The remote end hung up unexpectedlyエラーを返すこともできます。
Acumenus 2014年

52

使用--single-branchスイッチを (Gitの1.7.10のとして利用可能)。構文は次のとおりです。

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

例えば:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

利点:Gitはオブジェクトを受け取り、指定されたブランチ/タグのみのデルタを解決する必要があります-まったく同じ量のファイルをチェックアウトします!ソースリポジトリによっては、これによりディスク領域を大幅に節約できます。(さらに、それははるかに速くなります。)


3
この回答に反対票を投じた/反対票を投じた人:反対票の簡単な説明もコメントに残してください。(私は少し混乱しているので、尋ねてください。なぜなら、afaikは、これが与えられた問題の最善の解決策だからです。そして、あなたがそう思わないなら、私は理由を知りたいのです。)どうもありがとう。
eyecatchUp 2016年

5
.. SOF上の生命ことを...自分downvotes可能性が高い根拠のある、あなたの答えは非常に良い..ですdownvotesのあまり意味を持たないでください
javadba

gitバージョン2.22.0.windows.1では機能しませんでした
Mahesh

29

最初にその特定のリモートのすべてのタグをフェッチします

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

または単にタイプする

git fetch <remote>

次に、利用可能なタグを確認します

git tag -l

次に、以下のコマンドを使用してその特定のタグに切り替えます

git checkout tags/<tag_name>

これがあなたに役立つことを願っています!


なぜ´git tag -l´を使用するのか´git tag´と同じである必要がありますか?
serup

1
@serup; 利用可能なタグgit taggit tag -lリストしながらタグを追加します
JoostDöbkenDec

18

タグがlinux sortコマンドを使用してソートできる場合は、これを使用します。

git tag | sort -n | tail -1

例えば。がgit tag返された場合:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 出力されます:

v1.0.5

git tag | sort -n | tail -2 | head -1 出力されます:

v1.0.4

(2番目に新しいタグを要求したため)

タグをチェックアウトするには、まずリポジトリを複製してから、次のように入力します。

git checkout v1.0.4

..または必要なタグ。


25
あなたはv1.0.10に達し、その後、悪いことが起こる:)までは
ローラン・グレゴワール

10
タグを時系列に並べ替えるにはgit for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

最新バージョンを自動的にチェックアウトするワンライナーgit checkout `git tag | sort -n | tail -1`
weiji14

sort -V代わりに使用したい場合がありsort -nます。前者は、必ずしも数値であるとは限らないバージョンを正しく処理します(例:「1.2.3」)。また、「0.4.10」は「0.4.1」の後に続き、「0.4.2」の後には表示されないことも理解し-nています。
Mateusz Misiorny 2017

16

git checkoutのドキュメントを確認したところ、興味深いことが1つ明らかになりました。

git checkout -b <new_branch_name> <start_point>、ここで<start_point>は、新しいブランチを開始するコミットの名前です。デフォルトはHEADです

したがって、次のようにタグ名(タグはコミットの名前にすぎないため)に言及できます。

>> git checkout -b 1.0.2_branch 1.0.2
以降、一部のファイルを変更
>> git push --tags

PS:Gitでは、タグを直接更新することはできません(タグはコミットのラベルにすぎないため)。ブランチと同じタグをチェックアウトしてからコミットし、別のタグを作成する必要があります。


1
または、変更を加える予定がなく、そのタグでコードがどのように表示されるかを確認したい場合は、ブランチを作成せずにタグをチェックアウトできます。「切り離されたヘッド」の状態であることを説明するテキストが表示され、必要に応じて後でいつでもブランチを作成できます。
MatrixFrog 2010年

16
git fetch <gitserver> <remotetag>:<localtag>

===================================

私はこれをやった。まず、タグ名のスペルを知っていることを確認しました。

git ls-remote --tags gitserver; : or origin, whatever your remote is called

これにより、gitサーバー上のタグのリストから選択できます。元のポスターは彼のタグの名前をすでに知っていたので、この手順は誰にとっても必要ではありません。実際のリストはより長くなりましたが、出力はこのようになりました。

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

必要なタグを選び、それを取得しました。

git fetch gitserver Fix_110

次に、これをローカルマシンでタグ付けし、タグに同じ名前を付けました。

git tag Fix_110 FETCH_HEAD

私が取り組んでいるプロジェクトは大規模で、すっきりとしたクリーンな環境で開発したいので、他の人が提案するようにリモートリポジトリのクローンを作成したくありませんでした。これは、リポジトリ全体のクローンを作成することを提案するソリューションよりも、「特定のタグをダウンロードする方法を理解しようとしている」という元の質問に近いと思います。(たとえば)DOS 0.1のソースコードを確認したいのに、なぜWindows NTとWindows 8.1のソースコードのコピーが必要なのかわかりません。

他の人が提案したように、私もCHECKOUTを使用したくありませんでした。私はブランチをチェックアウトしてもらい、それに影響を与えたくありませんでした。私が意図したのは、私が欲しいソフトウェアをフェッチして、何かをチェリーピックして開発に追加できるようにすることでした。

タグ付けされたコミットのコピーだけでなく、タグ自体をフェッチする方法がおそらくあります。フェッチしたコミットを自分でタグ付けする必要がありました。編集:ああ、はい、私は今それを見つけました。

git fetch gitserver Fix_110:Fix_110

コロンが表示されている場所は、remote-name:local-nameで、ここではタグ名です。これは、作業ツリーなどを混乱させることなく実行されます。リモートからローカルマシンにデータをコピーするだけなので、独自のコピーを持っています。

git fetch gitserver --dry-run Fix_110:Fix_110

--dry-runオプションを追加すると、必要なコマンドを確認したい場合に、コマンドの実行内容を確認できます。だから私は簡単だと思います

git fetch gitserver remotetag:localtag

本当の答えです。

=

タグに関する個別の注記...新しいものを開始するときは、通常、git initの後に空のリポジトリにタグを付けます。

git rebase -i XXXXX 

コミットが必要であり、「最初のソフトウェア変更を含む変更をどのようにリベースするのか」という疑問が生じます。だから私が働き始めると

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

つまり、最初の実際の変更の前にコミットを作成し、後で使用します

git rebase -i EMPTY 

最初の変更を含むすべての作業をリベースする場合。


8

ピータージョンソンの回答に基づいて、私は自分のための素敵な小さなエイリアスを作成しました。

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

別名「git checkout latest tag」。

これは、lOrangerが指摘したような状況を適切に処理する、GNUバージョンのソートに依存しています。

v1.0.1
...
v1.0.9
v1.0.10

Macを使用している場合は、brew install coreutils代わりにgsortを呼び出します。



5

タグをチェックアウトする

タグが指しているファイルのバージョンを表示したい場合は、gitチェックアウトを実行できますが、これによりリポジトリが「デタッチされたHEAD」状態になり、いくつかの悪影響があります。

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

「デタッチされたHEAD」状態では、変更を加えてからコミットを作成すると、タグは同じままですが、新しいコミットはどのブランチにも属せず、正確なコミットハッシュを除いて到達できなくなります。したがって、たとえば古いバージョンのバグを修正する場合など、変更を加える必要がある場合は、通常、ブランチを作成する必要があります。

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

これを行ってコミットすると、version2ブランチはv2.0.0タグとは少し異なります。これは、新しい変更が行われるためです。注意してください。


4

これを行うには、github APIを使用します。

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
これはブランチとタグで機能しますが、それに対して作成されたタグが必要なマスターのヘッドでは機能しません。最小サイズのバージョンを取得するための非常にエレガントな方法です。
J0hnG4lt 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.