Semver 方面
根据 semver,不稳定的较新版本可以用连字符标记,如spec item 9
预发布版本可以通过在补丁版本之后附加一个连字符和一系列点分隔标识符来表示。标识符必须仅包含 ASCII 字母数字和连字符 [0-9A-Za-z-]。标识符不得为空。数字标识符不得包含前导零。预发布版本的优先级低于相关的普通版本。预发布版本表明该版本不稳定,可能无法满足其相关正常版本所表示的预期兼容性要求。示例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92、1.0.0-x-y-z.–.
所以这里的问题是你改变了什么?如果您刚刚添加了一些功能,但没有对 API 引入任何重大更改,则应将不稳定版本标记为:v1.1.0-alpha.1。然后可以将不稳定版本的修复标记为v1.1.0-alpha.2 等等。
如果您以破坏性方式更改了软件包的 API,则该版本应标记为 v2.0.0-alpha.1。对 alpha 的修复应以与以前相同的方式进行标记:增加 -alpha 后缀之后的最后一位数字。
最后,如果您没有以任何方式更改 API,也没有添加任何功能,那么您只需将您的版本标记为 v1.0.1-alpha。基本上,标准的 semver 东西。
当然,如果您处于这种特殊情况,那么事实是您过早地将您的包标记为v1.0.0,因为推送补丁仍然会导致不稳定。
您可以通过删除标记来寻址/重新标记现有的v1.0.0 版本,并相应地标记该版本。这可以使用以下命令轻松完成:
# check out the version to re-tag
$ git checkout v1.0.0
# tag the version with the desired tag
$ git tag v0.1.1
# push the tag
# if you're brave, you could just git push --tags, but that's not ideal
$ git push origin v0.1.1
# now delete the offending tag
$ git tag -d v1.0.0
# remove the tag remotely
$ git push origin :refs/tags/v1.0.0
好的,github 存储库不再有v1.0.0 标签。存储库的任何克隆可能仍然具有旧标签,如果有人推送git push --tags,那将恢复v1.0.0 标签(因此我的评论说git push --tags 并不理想)。如果您的包在野外使用,则需要与包的所有用户进行一些沟通。
最后,继续前进,您最好阅读go mod 如何处理版本(其要点是:遵循 semver 2.0,您应该没问题)。伪发行版和预发行版具有特定格式 you should use
Golang(go mod)细节
一旦一个模块被标记并发布,它就在那里。你应该做的是使用retract directive 发出一个损坏版本的撤回
正如@bcmills 在 cmets 中指出的那样:retract 指令仅适用于更高版本。您的特定情况的解决方案(实际上是在版本v0.5.x,但想要撤回发布v1.0.0)可以通过标记更高版本并撤回它来完成:
retract (
v1.0.0
v1.0.1 // the new version that issues the retraction retracts itself
)
从现在开始,尚未收回的最新版本包将是 v0.5.x,您应该已准备就绪。
发布撤回带有乐观标签的版本。例如,如果您将此版本重新标记为v0.1.0,那么您也许可以使用replace directive。老实说,我从来没有使用过replace 将我的模块的一个版本指向同一模块的另一个版本,但这可能值得一试:
replace (
github.com/your/package v1.0.0 => github.com/your/package v0.1.0
)
我必须说:即使这可行,它也是一个 hack,我不能保证它与你发布的新版本的软件包一起玩得很好。我强烈建议您撤回v1.0.0 标签,重新标记它(可以说v0.0.0 是这里要使用的版本),从现在开始,遵循 semver 和 golang 预发布/伪-发布版本控制标准。