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 调用并转到第二个。

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

第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 请求,-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"
}

在继续之前,请注意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/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"
  }
}

现在您可以导航到 GitHub 上的项目并转到“切换分支/标签”并在那里查看您的标签。

希望这可以帮助!

于 2013-03-28T09:26:40.523 回答
3

您还可以尝试新的 Releases API

http://developer.github.com/v3/repos/releases/#create-a-release

curl \
    --user <username> \
    --header "Accept: application/vnd.github.manifold-preview" \
    --data "tag_name=mytagname" \
    "https://api.github.com/repos/<username>/<repository>/releases"
于 2013-10-20T09:10:13.190 回答
1

这是 curl 将创建Releases。(但正如ChuckK提到的,它可能只创建轻量级标签,我还没有亲自验证过)

curl \
    --user <Your Github username> \
    --header "Accept: application/vnd.github.manifold-preview" \
    --data '{"tag_name": "v1.0.0", "target_commitish": "master", "name": "v1.0.0", "body": "Description of the release", "draft": false, "prerelease": false }' \
"https://api.github.com/repos/<OrganizationName>/<RepoName>/releases" -X POST

在这里添加这个,以防有人来找这个,比如我。

于 2017-05-28T18:19:24.953 回答