refspecを使用してGitタグをブランチにどのようにプッシュしますか?


216

たとえば、自分のタグ1.0.0をリモートmasterブランチに強制的にプッシュしたい。

私は今次のことをしています:

git push production +1.0.0:master

私が気にしているのは、1.0.0タグ内のコードmasterがリモートリポジトリのブランチにプッシュされることだけなので、pushを強制したいのです。

何が悪いのですか?

アップデート#1

GitリポジトリがあるサーバーにSSHで接続して実行するgit branch -lと、masterブランチも表示されません。

アップデート#2

git tag -lリモートGitリポジトリー内から実行した後、それmasterがリストされていることがわかります。つまり、以下を実行したときです。

git push production 1.0.0:master

実際にタグをプッシュし、新しいブランチではなくという タグを作成しましたmaster

私は基本的にプッシュする内容タグのを1.0.0masterリモートのGitリポジトリのブランチ。


「機能していない」とはどういう意味ですか?Gitは特定のエラーを出しますか、それともnull効果がありますか?
vcsjones 2010年

申し訳ありません。はい、基本的に、サーバー、gitリポジトリにSSH接続し、git branch -lを実行してブランチを一覧表示すると、他のブランチしか表示されません。ただし、Gitプッシュプロダクション+1.0.0:masterはプッシュしました。再度プッシュすると、Everything up-to-dateと表示されますが、リモートサーバーにマスターブランチが表示されません。
Michael van Rooijen、

5
受け入れた回答を変更する必要があります。2番目の回答は、承認済みとマークされている回答よりもはるかに簡単です。
Pedro Rolo 2012

返事が遅くなってごめん。私は同意し、受け入れられた回答を変更しました。
Michael van Rooijen

1
@MichaelvanRooijen私はあなたが選んだ受け入れられた答えが実際にこの問題をどのように解決するのか理解できません。ブランチをタグで上書きするのではなく、タグをリモートにプッシュするだけです。

回答:


61

1.0.0注釈付きタグであるため、おそらく失敗しています。おそらく、次のエラーメッセージを見た可能性があります。

エラー:コミットされていないオブジェクトをブランチ参照/ヘッド/マスターに書き込もうとしています

注釈付きタグには、タグ付きコミットオブジェクトを指す独自のタイプのオブジェクトがあります。ブランチはタグオブジェクトを有効に指すことができず、オブジェクトをコミットするだけです。オブジェクトをコミットし、代わりにそれをプッシュするには、注釈付きタグを「剥がす」必要があります。

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

この場合にも機能する別の構文がありますが、タグオブジェクトがコミット(またはコミットを指すタグオブジェクト(…を指すタグオブジェクト)コミット)以外を指している場合、少し異なることを意味します。 。

git push production +1.0.0^{}:master

これらのタグ剥離構文はgit-rev-parse(1)で説明されていますリビジョンの指定のでます。


1
これで問題は解決しました!ただし、masterブランチはすでに存在している必要があります。しかし、これは私の側の問題ではありません。あなたの助けをありがとう!
Michael van Rooijen、

2
@マイケル:ああ。はい、マスターが存在しない場合(ブランチまたはタグとして)、ブランチではなくマスターgit push rep +tag:masterという名前のタグが作成されます。(ここでも、マスターがブランチまたはタグとして存在しない場合)は「エラー:修飾されていない宛先にプッシュできません」で失敗します。(マスターブランチ/タグが存在する前に)必要なことを実行するコマンドは(ブランチが格納されるネームスペースです)。git push rep +tag~0:mastergit push rep +tag~0:refs/heads/masterrefs/heads/
Chris Johnsen、

すごい!それは私を驚くほどうまく助けるでしょう。とても便利!その情報を投稿してくれてありがとう。
Michael van Rooijen、

4
@brad:~{commit}構文はリテラルです(つまり、常に9文字です)。この単語commitはここではプレースホルダーではありません。
Chris Johnsen、2011

1
ああ大丈夫!申し訳ありませんが、私はあなたが特定のコミットをするつもりだったと思っていましたが、今はもっと理にかなっています。
ブラッド、2011

469
git push --tags production

4
タグがリモートにすでに存在する場合は、最初にでリモートタグを削除する必要がありますgit push production :1.0.0
respectTheCode

1
あらゆる機会で同じ名前のブランチがあります場合:「1.0.0」を、このプッシュはとても良く使用することを失敗します:git push production :refs/tags/1.0.0削除タグにのみ
ウラジミール

1
@Nerian:タグをプッシュするだけだと思う
bstpierre 2013

5
これは実際にどのようにして強制的にプッシュすることによってタグでブランチを上書きすることに関するオリジナルのポスターの問題を解決しますか?これはタグのすべてをリモートにプッシュするだけで、ブランチを上書きしません。

1
1つのタグをプッシュする方法を尋ねる質問ではありませんか?このコマンドは、それだけではありません。
クリスマーティン

61

次のようにタグを作成してから、GitHubにプッシュします。

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
すべてのタグをプッシュします
Dawid Drozd 2013年

2
これは、ブランチをタグで上書きすることに関する元のポスターの問題を実際には解決しないことに注意してください。ブランチに影響を与えることなく、タグをリモートにプッシュするだけです。

10

単一のタグをプッシュする場合: git push <reponame> <tagname>

例えば、git push production 1.0.0。タグはブランチにバインドされておらず、コミットにバインドされています。

タグのコンテンツをマスターブランチに配置する場合は、ローカルのマシンで行います。あなたはあなたの地元のマスターブランチで開発を続けたと思います。次に、ちょうどgit push origin master十分なはずです。


5
これは、ブランチをタグで上書きすることに関する元のポスターの問題を実際には解決しないことに注意してください。ブランチに影響を与えることなく、タグをリモートにプッシュするだけです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.