我正在尝试使用curl命令来标记提交。这可能吗?我浏览了GitHub的create-a-tag-object链接,但它不起作用。
答案 0 :(得分:20)
创建标记有点复杂,但如果您只是遵循API文档,那么您应该没问题。请注意API docs say:
请注意,创建标记对象不会创建在Git中生成标记的引用。如果要在Git中创建带注释的标记,则必须执行此调用以创建标记对象,然后创建refs / tags / [tag]引用。如果你想创建一个轻量级标签,你只需要创建引用 - 这个调用是不必要的。
因此,在继续创建标记之前,您应该知道要创建哪种标记 - annotated or lightweight。基本上,带注释的标签与轻量级标签相同,但它还包含标签的消息,有关标签作者的信息以及标签创建的日期和时间。轻量级标记只是指向历史记录中特定提交的指定指针。
好的,那么,API文档基本上说的是:如果你想创建一个带注释的标签 - 你必须进行2次API调用,如果你想创建一个轻量级标签 - 你必须只做1呼叫。因此,我将举例说明使用2个API调用创建带注释的标记,如果要创建轻量级标记 - 只需跳过第一个API调用并转到第二个。
要创建带注释的标记,您必须:
Create a tag object using the tags 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文档here中描述了参数的含义。
保存文件后,可以使用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 Created
HTTP响应,其中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
),因为您将在下一步中使用此值。
Create a tag reference using the references API。关于请求应该是什么样的,API文档在这里更加清晰。因此,您首先必须在磁盘上创建另一个名为tag_ref_req.json
的文件,并将此内容放入其中:
{
"ref": "refs/tags/v0.0.1",
"sha": "e6d9fb6b9a13cab11923345e2400d5cf8df97267"
}
但请注意,此JSON中sha
的值取决于您正在创建的标记的类型。如果要创建带注释的标记,则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 Created
HTTP响应,正文将是一个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上导航到您的项目并转到“切换分支/标签”并在那里查看您的标记。
希望这有帮助!
答案 1 :(得分:2)
您也可以尝试使用新的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"
答案 2 :(得分:0)
这将是curl将创建 Releases 。 (但正如ChucK提到的,它可能只创建轻量级标签,我个人未经验证过这个)
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
在这里添加,欢迎任何人来寻找这个,就像我一样。