今天我正在浏览一个项目的日志,并意识到我不久前发了一个标签名称.有没有办法重命名标签?谷歌没有发现任何有用的东西.
我意识到我可以查看标记版本并制作新标签,我甚至尝试过.但这似乎创建了一个不太正确的标签对象.一个,
git tag -l
Run Code Online (Sandbox Code Playgroud)
相对于所有其他标签,它不按顺序列出.我不知道这是否重要,但它让我相信新标签对象不是我想要的.我可以忍受,因为我真的只关心标签名称与文档匹配,但我宁愿"正确",假设有正确的方法来做到这一点.
Cas*_*son 1935
以下是将标记重命名old为new:
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags
Run Code Online (Sandbox Code Playgroud)
push命令中的冒号从远程存储库中删除标记.如果你不这样做,当你拉动时,Git会在你的机器上创建旧标签.
最后,确保其他用户删除已删除的标记.请告诉他们(同事)运行以下命令:
git pull --prune --tags
Run Code Online (Sandbox Code Playgroud)
小智 290
最初的问题是如何重命名标签,这很简单:首先创建NEW作为OLD的别名:git tag NEW OLD然后删除OLD : git tag -d OLD.
关于"Git方式"和(in)完整性的引用是不合适的,因为它讨论的是保留标记名称,但使其引用不同的存储库状态.
kai*_*ser 111
除了其他答案:
首先,你需要建立一个别名了的旧标签名称,指向原来的承诺:
git tag new old^{}
Run Code Online (Sandbox Code Playgroud)
然后你需要在本地删除旧的:
git tag -d old
Run Code Online (Sandbox Code Playgroud)
然后删除远程位置上的标记:
# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old
Run Code Online (Sandbox Code Playgroud)
最后,您需要将新标记添加到远程位置.在您完成此操作之前,不会添加新标记:
git push origin --tags
Run Code Online (Sandbox Code Playgroud)
为每个远程位置迭代这个.
请注意,Git Tag更改对包的消费者的影响!
Rob*_*anu 28
如果它已发布,则无法将其删除(不会有被涂焦油和羽毛的风险).'Git方式'是:
理智的事情.只是承认你搞砸了,并使用不同的名字.其他人已经看过一个标签名称,如果你保持相同的名称,你可能会遇到两个人都有"版本X"的情况,但他们实际上有不同的"X".所以只需称它为"X.1"并完成它.
或者,
疯狂的事情.你真的想把新版本称为"X",即使其他人已经看过旧版本.所以再次使用git-tag -f,好像你还没有发布旧版本一样.
它太疯狂了,因为:
Git没有(也不应该)改变用户背后的标签.因此,如果有人已经获得旧标签,那么在树上进行git-pull不应该只是让它们覆盖旧标签.
如果有人从你那里得到了一个发布标签,你就不能通过更新自己的标签来改变标签.这是一个很大的安全问题,因为人们必须能够信任他们的标签名称.如果你真的想做疯狂的事情,你需要了解它,告诉别人你搞砸了.
所有礼貌的手册页.
Von*_*onC 25
这个维基页面有一个有趣的单行,它提醒我们,我们可以推几个参考:
git push origin <refs/tags/old-tag>:<refs/tags/new-tag> :<refs/tags/old-tag> && git tag -d <old-tag>
Run Code Online (Sandbox Code Playgroud)
并要求其他克隆人做
git pull --prune --tags
所以想法是推动:
<new-tag>对于<old-tag>:引用的每个提交<refs/tags/old-tag>:<refs/tags/new-tag>,<old-tag>::<refs/tags/old-tag>请参阅示例" 更改git存储库中标记的命名约定? ".
Jar*_*ipp 25
作为其他答案的补充,我添加了一个别名,只需一步即可完成所有操作,使用更熟悉的*nix move命令.参数1是旧标记名称,参数2是新标记名称.
[alias]
renameTag = "!sh -c 'set -e;git tag $2 $1; git tag -d $1;git push origin :refs/tags/$1;git push --tags' -"
Run Code Online (Sandbox Code Playgroud)
用法:
git renametag old new
Run Code Online (Sandbox Code Playgroud)
对于一个或几个标签,请遵循3步方法。
command: git rev-parse <tag name>
example: git rev-parse v0.1.0-Demo
example output: db57b63b77a6bae3e725cbb9025d65fa1eabcde
Run Code Online (Sandbox Code Playgroud)
command: git tag -d <tag name>
example: git tag -d v0.1.0-Demo
example output: Deleted tag 'v0.1.0-Demo' (was abcde)
Run Code Online (Sandbox Code Playgroud)
command: git tag -a <tag name> -m "appropriate message" <commit id>
example: git tag -a v0.1.0-full -m "renamed from v0.1.0-Demo" db57b63b77a6bae3e725cbb9025d65fa1eabcde
example output: Nothing or basically <No error>
Run Code Online (Sandbox Code Playgroud)
一旦本地git做好了标记名称更改的准备,就可以将这些更改推回原点,以供其他人使用。
小智 6
对于喜欢冒险的人来说,可以在一个命令中完成:
mv .git/refs/tags/OLD .git/refs/tags/NEW
Run Code Online (Sandbox Code Playgroud)
这个答案通过使用现有标签中的标签信息创建一个重复的带注释的标签来解决这个问题——包括所有标签信息,如标签、消息和标签日期。
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref \
"refs/tags/$SOURCE_TAG" --format="%($1)" ; }; \
GIT_COMMITTER_NAME="$(deref taggername)" \
GIT_COMMITTER_EMAIL="$(deref taggeremail)" \
GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" \
"$(deref "*objectname")" -a -m "$(deref contents)"
git tag -d old
git push origin new :old
Run Code Online (Sandbox Code Playgroud)
更新SOURCE_TAG和NEW_TAG值以匹配您的旧标签名称和新标签名称。
据我所知,所有其他答案都有微妙的问题,或者没有完全复制标签的所有内容(例如,他们使用新的标签日期,或当前用户的信息作为标签)。他们中的许多人都发出重新标记警告,尽管这不适用于这种情况(这是为了将标签名称移动到不同的提交,而不是重命名为不同名称的标签)。我已经做了一些挖掘,我相信我已经拼凑出解决这些问题的解决方案。
该git-tag文档指定了带注释的标签的部分。要真正成为一个难以区分的重命名,这些元素在新标签中应该是相同的。
标签对象(用
-a、-s、 或创建的-u)被称为“带注释的”标签;它们包含创建日期、标记者名称和电子邮件、标记消息和可选的 GnuPG 签名。
我只是在这个答案中解决未签名的标签,尽管将此解决方案扩展到签名标签应该是一件简单的事情。
old示例中使用了一个名为的带注释的标记,并将重命名为new.
首先,我们需要获取现有标签的信息。这可以使用for-each-ref:
命令:
git for-each-ref refs/tags --format="\
Tag name: %(refname:short)
Tag commit: %(objectname:short)
Tagger date: %(taggerdate)
Tagger name: %(taggername)
Tagger email: %(taggeremail)
Tagged commit: %(*objectname:short)
Tag message: %(contents)"
Run Code Online (Sandbox Code Playgroud)
输出:
Tag commit: 88a6169
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Run Code Online (Sandbox Code Playgroud)
可以使用在步骤 1 中从现有标签收集的信息创建具有新名称的重复标签。
提交 ID 和提交消息可以直接传递给git tag.
可以使用git 环境变量 GIT_COMMITTER_NAME、GIT_COMMITTER_EMAIL、来设置标记器信息(姓名、电子邮件和日期)GIT_COMMITTER_DATE。在此上下文中的日期用法在On Backdating Tags文档中进行了描述git tag;另外两个是我通过实验想出来的。
GIT_COMMITTER_NAME="John Doe" GIT_COMMITTER_EMAIL="j.doe@example.com" \
GIT_COMMITTER_DATE="Mon Dec 14 12:44:52 2020 -0600" git tag new cda5b4d -a -m "Initial tag
Body line 1.
Body line 2.
Body line 3."
Run Code Online (Sandbox Code Playgroud)
两个标签的并排比较表明它们在所有重要方面都是相同的。这里唯一不同的是标签本身的提交引用,这是预期的,因为它们是两个不同的标签。
命令:
git for-each-ref refs/tags --format="\
Tag commit: %(objectname:short)
Tagger date: %(taggerdate)
Tagger name: %(taggername)
Tagger email: %(taggeremail)
Tagged commit: %(*objectname:short)
Tag name: %(refname:short)
Tag message: %(contents)"
Run Code Online (Sandbox Code Playgroud)
输出:
Tag commit: 580f817
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: new
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Tag commit: 30ddd25
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Run Code Online (Sandbox Code Playgroud)
作为单个命令,包括检索当前标签数据:
Tag commit: 580f817
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: new
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Tag commit: 30ddd25
Tagger date: Mon Dec 14 12:44:52 2020 -0600
Tagger name: John Doe
Tagger email: <j.doe@example.com>
Tagged commit: cda5b4d
Tag name: old
Tag message: Initial tag
Body line 1.
Body line 2.
Body line 3.
Run Code Online (Sandbox Code Playgroud)
接下来,应在本地删除现有标签。如果您希望保留旧标签和新标签(即复制标签而不是重命名),则可以跳过此步骤。
SOURCE_TAG=old NEW_TAG=new; deref() { git for-each-ref "refs/tags/$SOURCE_TAG" --format="%($1)" ; }; GIT_COMMITTER_NAME="$(deref taggername)" GIT_COMMITTER_EMAIL="$(deref taggeremail)" GIT_COMMITTER_DATE="$(deref taggerdate)" git tag "$NEW_TAG" "$(deref "*objectname")" -a -m "$(deref contents)"
Run Code Online (Sandbox Code Playgroud)
假设您在远程存储库中工作,现在可以使用git push以下方式推送更改:
git tag -d old
Run Code Online (Sandbox Code Playgroud)
这会推送new标签,并删除old标签。
| 归档时间: |
|
| 查看次数: |
238038 次 |
| 最近记录: |