Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查远程git标记是否已更改_Git - Fatal编程技术网

检查远程git标记是否已更改

检查远程git标记是否已更改,git,Git,我有一个本地git repo,其中一个工作树与特定标记同步。我想看看originrepo是否已经尽可能有效地更改了该标记,如果是这样,则创建一个新的工作树 我使用git rev list-n1标记名查看本地标记的散列,使用git ls remote-q origin refs/tags/tagname^{}查看远程标记 这适用于我测试过的所有情况,但现在我发现在某些情况下,^{}导致它返回空。遥控器有标记,但没有它的^{}形式 e、 g 我搞砸了什么?我如何处理有^{}且需要取消引用的情况以及没

我有一个本地git repo,其中一个工作树与特定标记同步。我想看看originrepo是否已经尽可能有效地更改了该标记,如果是这样,则创建一个新的工作树

我使用
git rev list-n1标记名
查看本地标记的散列,使用
git ls remote-q origin refs/tags/tagname^{}
查看远程标记

这适用于我测试过的所有情况,但现在我发现在某些情况下,
^{}
导致它返回空。遥控器有标记,但没有它的
^{}
形式

e、 g

我搞砸了什么?我如何处理有^{}且需要取消引用的情况以及没有取消引用的情况


必须有一个更简单的答案。

这个
^{}
真的有点麻烦。它告诉Git剥离一个标记:查找(大概是注释过的)标记指向的对象,而不是查找注释过的标记本身

我正在使用
git rev list-n1标记名
查看本地标记的散列

这是问题的真正根源:
git rev list
列出提交,但标记引用可能不指向提交。当标记引用指向带注释的标记时,您可能应该获取带注释标记对象的哈希ID。为此,请使用
git rev parse
而不是
git rev list

$ git rev-parse v2.19.1
0d3c37ddaccbb48809fdd3810ebb3f2bc961973c
$ git rev-parse v2.19.1^{}
cae598d9980661a978e2df4fb338518f7bf09572
$ git rev-list -n1 v2.19.1
cae598d9980661a978e2df4fb338518f7bf09572
(这里
v2.19.1
是Git存储库中的一个带注释的标记)。请注意标记的带注释的标记如何导致提交,因此使用剥离选项的
git rev parse
git rev list
都找到了相同的提交。1

使用
git ls remote
时,如果对远程设备的标记进行了注释,则远程设备会传递标记的对象哈希以及带有
^{}
后缀的已注释标记解析到的对象的哈希ID。2如果未对远程设备的标记进行注释,
git ls remote
提供该标记指向的对象的哈希ID。(标记直接指向那里,而不是通过带注释的标记对象。)

标记永远不应该更改,例如,永远不应该从带注释的对象更改为不带注释的对象,反之亦然,也永远不应该更改基础对象,但如果标记确实更改,则哈希ID将更改,即使基础标记对象哈希ID相同。但在这种情况下,您可能还是希望更新本地标记


1如果标记指向其他对象类型a树或blob,
git rev list
将不起任何作用,而
git rev parse
将成功;可以使用
^{commit}
使
git rev parse
失败:

$ git rev-list -n1 xxx
$ git rev-parse xxx
596ad6ec669abd0c6ad6034cd3b219fb6ea3ab1d
$ git cat-file -p xxx
object b22571e0489ee9a664885594316a7ccfc9186360
type blob
[snip]
$ git rev-parse xxx^{}
b22571e0489ee9a664885594316a7ccfc9186360
$ git rev-parse xxx^{commit}
error: xxx^{commit}: expected commit type, but the object dereferences to blob type
xxx^{commit}
error: xxx^{commit}: expected commit type, but the object dereferences to blob type
fatal: ambiguous argument 'xxx^{commit}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$git版本列表-n1 xxx
$git修订版xxx
596ad6ec669abd0c6ad6034cd3b219fb6ea3ab1d
$git cat文件-p xxx
对象b22571e0489ee9a664885594316a7ccfc9186360
类型blob
[剪报]
$git rev parse xxx^{}
b22571e0489ee9a664885594316a7ccfc9186360
$git rev parse xxx^{commit}
错误:xxx^{commit}:应为提交类型,但对象取消了对blob类型的引用
xxx^{commit}
错误:xxx^{commit}:应为提交类型,但对象取消了对blob类型的引用
致命:不明确的参数“xxx^{commit}”:未知修订或路径不在工作树中。
使用“---”将路径与修订分开,如下所示:
'吉特[…]-[…]'
2请注意,如果一个带注释的标记对象指向另一个带注释的标记对象,或指向一个带注释的标记对象链,
^{}
解析过程仍然会找到最终的对象,不管它是什么。因此,最好讨论“已解析对象”或“剥离值”或任何您想要描述查找非标记对象过程的短语


(剥离非注释标记或任何其他有效的哈希ID是不允许的,但这是允许的。您可以添加任意数量的
^{}
后缀,尽管只有第一个后缀可以执行任何操作,即使如此,只要对象是注释标记即可。)

谢谢您的帖子。我有一些我不清楚的后续问题。您建议使用rev parse来获取带注释的标记,但后来您说最好讨论剥离值。rev list不是剥离值吗?我正在安装一个同步远程git回购的本地视图的工具,并尝试尽可能正确地处理尽可能多的奇怪情况。我认为解决提交散列是我能得到的最“剥离”的?目标是,给定一个散列、分支名称或标记名称,检查解析为本地的内容,检查解析为上游的内容,如果不相等,则从上游同步并生成一个新的工作树。
git rev list
仅适用于提交(无可否认,这是大多数标记)。如果需要剥离值,可以使用它,或者为了在面对非提交标记时的可靠性,可以使用
^{}
^{commit}
语法和
git rev parse
。在任何情况下,考虑到您的工具的重要性,您都希望使用未剥离的标记,以防有人将带注释的标记替换为带签名的带注释的标记,指向同一对象,但这次使用的是GPG签名。在任何情况下,请再次阅读“talk about”句子(或者我应该重新措辞):如果您的意思是“剥离多次后标记指向的对象”,请使用“剥离”动词;如果您指的是“标记本身”“,没有一个动词来说明这一点。我真的想引用标记指向的commit。当我
ls remote
一个没有注释的标记,并且我使用peel语法时,它不会返回任何内容。这就是我一直在努力解决的问题。手册页使它听起来像是语法,应该是一个无操作的非注释标记,但它就是不工作。无论如何,我将切换到rev parse,因为它似乎不会对引用标记本身造成任何伤害,并且适用于注释的和非注释的。谢谢
$ git rev-list -n1 xxx
$ git rev-parse xxx
596ad6ec669abd0c6ad6034cd3b219fb6ea3ab1d
$ git cat-file -p xxx
object b22571e0489ee9a664885594316a7ccfc9186360
type blob
[snip]
$ git rev-parse xxx^{}
b22571e0489ee9a664885594316a7ccfc9186360
$ git rev-parse xxx^{commit}
error: xxx^{commit}: expected commit type, but the object dereferences to blob type
xxx^{commit}
error: xxx^{commit}: expected commit type, but the object dereferences to blob type
fatal: ambiguous argument 'xxx^{commit}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'