如何使用curl命令在API中标记Commit

Mir*_*hdi 12 github-api

我试图使用curl命令标记提交.这可能吗?我浏览了GitHub 的create-a-tag-object链接,但它不起作用.

Iva*_*zak 22

创建标记有点复杂,但如果您只是遵循API文档,那么您应该没问题.请注意,API文档说:

请注意,创建标记对象不会创建在Git中生成标记的引用.如果要在Git中创建带注释的标记,则必须执行此调用以创建标记对象,然后创建refs/tags/[tag]引用.如果你想创建一个轻量级标签,你只需要创建引用 - 这个调用是不必要的.

因此,在继续创建标记之前,您应该知道要创建哪种标记 - 注释或轻量级.基本上,带注释的标签与轻量级标签相同,但它还包含标签的消息,有关标签作者的信息以及标签创建的日期和时间.轻量级标记只是指向历史记录中特定提交的指定指针.

好吧,那么,API文档基本上说的是:如果你想创建一个带注释的标签 - 你必须进行2次API调用,如果你想创建一个轻量级标签 - 你将只需要进行一次调用.因此,我将举例说明使用2个API调用创建带注释的标记,如果要创建轻量级标记,只需跳过第一个API调用,然后转到第二个API调用.

要创建带注释的标记,您必须:

步骤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"
}
Run Code Online (Sandbox Code Playgroud)

显然,您必须替换文档中的信息以反映您的情况.参数的含义在此处的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"
Run Code Online (Sandbox Code Playgroud)

因此,该-v部分将强制curl输出所有HTTP头,该-X POST部分意味着必须发出HTTP POST请求,-d @tag_object_req.json指定哪个文件将用作POST请求的内容(正文),--header "Content-Type:application/json"指定请求的媒体类型( JSON消息),并-u izuzak指定您的授权用户名(curl会在您提出请求时询问您的密码).

您获得的响应应该是201 CreatedHTTP响应,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"
}
Run Code Online (Sandbox Code Playgroud)

在继续之前,请注意sha刚刚创建的对象的属性(e6d9fb6b9a13cab11923345e2400d5cf8df97267),因为您将在下一步中使用此值.

第2步

使用引用API创建标记引用.关于请求应该是什么样的,API文档在这里更加清晰.因此,您首先必须在磁盘上创建另一个名为的文件tag_ref_req.json,并将此内容放入:

{
  "ref": "refs/tags/v0.0.1",
  "sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267"
}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,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"
Run Code Online (Sandbox Code Playgroud)

请注意,我们现在正在请求https://api.github.com/repos/izuzak/test/git/refs将第二个文件作为内容.

响应应该再次是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"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在GitHub上导航到您的项目,然后转到"切换分支/标记"并在那里查看您的标记.

希望这可以帮助!