15

curl コマンドを使用してコミットにタグを付けようとしています。これは可能ですか?GitHubのcreate-a-tag-objectリンクを使用しましたが、機能しません。

4

3 に答える 3

31

タグの作成は少し複雑ですが、API ドキュメントに従うだけであれば問題ありません。API ドキュメントには次のように記載されていることに注意してください。

タグ オブジェクトを作成しても、Git でタグを作成する参照は作成されないことに注意してください。Git で注釈付きタグを作成する場合は、この呼び出しを実行してタグ オブジェクトを作成し、refs/tags/[tag] 参照を作成する必要があります。軽量タグを作成する場合は、参照を作成するだけです。この呼び出しは不要です。

したがって、タグの作成に進む前に、作成するタグの種類 (注釈付きまたは軽量) を知っておく必要があります。基本的に、注釈付きタグは軽量タグと同じですが、タグのメッセージ、タグの作成者に関する情報、およびタグが作成された日時も含まれます。軽量タグは、履歴内の特定のコミットへの名前付きポインターです。

API ドキュメントの基本的な内容は、アノテーション付きタグを作成する場合は 2 つの API 呼び出しを行う必要があり、軽量タグを作成する場合は呼び出しを 1 回だけ行う必要があります。そこで、2 つの API 呼び出しで注釈付きタグを作成する例を示します。軽量タグを作成する場合は、最初の API 呼び出しをスキップして 2 番目の呼び出しに進んでください。

注釈付きタグを作成するには、次のことを行う必要があります。

ステップ1

タグ API を使用してタグ オブジェクトを作成します。API ドキュメントは、ここでパラメーターを渡す方法が少し不明確です。欠けているのは、サーバーに送信する必要があるメッセージの例です。したがって、tag_object_req.jsonローカル ディスクに という名前のファイルを作成し、次の JSON ドキュメントをその中に入れます。

{
  "tag": "v0.0.1",
  "object": "c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b",
  "message": "creating a tag",
  "tagger": {
    "name": "Ivan Zuzak",
    "email": "izuzak@gmail.com",
    "date": "2012-06-17T14:53:35-07:00"
  },
  "type": "commit"
}

明らかに、状況を反映するようにドキュメント内の情報を置き換える必要があります。パラメータの意味については、こちらの API ドキュメントで説明されています。

ファイルを保存したら、curl を使用して API 呼び出しを行い、タグ オブジェクトを作成できます。

curl -v -X POST -d @tag_object_req.json --header "Content-Type:application/json" -u izuzak "https://api.github.com/repos/izuzak/test/git/tags"

そのため、この-v部分は curl にすべての HTTP ヘッダーを強制的に出力させます。この-X POST部分は、HTTP POST 要求を行う必要があることを意味し、POST 要求-d @tag_object_req.jsonのコンテンツ (本文) として使用するファイルを--header "Content-Type:application/json"指定し、要求のメディア タイプを指定します ( JSON メッセージ)、および-u izuzak認証用のユーザー名を指定します (そして、curl は要求時にパスワードを要求します)。

取得する応答は HTTP 応答である必要があり201 Created、JSON メッセージは次のように構造化されています。

{
  "sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267",
  "url": "https://api.github.com/repos/izuzak/test/git/tags/e6d9fb6b9a13cab11923345e2400d5cf8df97267",
  "tagger": {
    "name": "Ivan Zuzak",
    "email": "izuzak@gmail.com",
    "date": "2012-06-17T21:53:35Z"
  },
  "object": {
    "sha": "c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b",
    "type": "commit",
    "url": "https://api.github.com/repos/izuzak/test/git/commits/c5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b"
  },
  "tag": "v0.0.1",
  "message": "creating a tag"
}

続行する前に、sha作成したオブジェクトの属性 ( e6d9fb6b9a13cab11923345e2400d5cf8df97267) に注意してください。この値は次の手順で使用するためです。

ステップ2

リファレンス API を使用してタグ リファレンスを作成します。API ドキュメントは、リクエストがどのように見えるべきかについて、ここでより明確になっています。したがって、最初に という名前の別のファイルをディスク上に作成し、tag_ref_req.jsonこのコンテンツを内部に配置する必要があります。

{
  "ref": "refs/tags/v0.0.1",
  "sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267"
}

shaただし、この JSONの の値は、作成するタグのタイプによって異なることに注意してください。注釈付きタグを作成している場合、sha の値は、前のステップで取得した値と同じ値 (タグ オブジェクトの sha) です ( e6d9fb6b9a13cab11923345e2400d5cf8df97267)。ただし、軽量タグを作成している場合は、タグ オブジェクトを作成していないため、sha の値は、タグでタグ付けしているコミット オブジェクトの sha になります。私の場合、ステップ 1 で、タグ付けしているコミット オブジェクトが であることがわかりますc5f8759ffd808d4a57ea36c63960f3e2cc6fcc2b。これはもちろん、軽量タグを作成している場合は異なります。

このファイルを作成し、sha とタグの名前を定義したら、curl を使用して、前の手順と同様の方法で API リクエストを作成できます。

curl -v -X POST -d @tag_ref_req.json --header "Content-Type:application/json" -u izuzak "https://api.github.com/repos/izuzak/test/git/refs"

https://api.github.com/repos/izuzak/test/git/refs2 番目のファイルをコンテンツとして にリクエストしていることに注意してください。

応答は再び201 CreatedHTTP 応答である必要があり、本文は次のような JSON ドキュメントになります。

{
  "ref": "refs/tags/v0.0.1",
  "url": "https://api.github.com/repos/izuzak/test/git/refs/tags/v0.0.1",
  "object": {
    "sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267",
    "type": "tag",
    "url": "https://api.github.com/repos/izuzak/test/git/tags/e6d9fb6b9a13cab11923345e2400d5cf8df97267"
  }
}

これで、GitHub のプロジェクトに移動し、[ブランチ/タグの切り替え] に移動して、そこでタグを確認できます。

お役に立てれば!

于 2013-03-28T09:26:40.523 に答える