git远程名称中哪些字符是非法的?

时间:2017-01-04 10:08:46

标签: git git-remote

git远程名称中哪些字符是非法的?

我没有发现它是git文档。

3 个答案:

答案 0 :(得分:7)

我也没有在文档中找到任何内容。那么让我们来看看源代码。

当您尝试添加名称无效的遥控器或将遥控器重命名为无效名称时,您将收到错误消息,如

  

致命:'foo @ {bar'不是有效的远程名称

所以让我们search the Git source for that

我们看到Git有点倒退:它测试here addhere重命名(mv)){{1} }是一个有效的提取引用,由valid_fetch_refspec(<the ref name>)确定,后者又调用parse_refspec_internal(...)

后者做了很多检查,大部分时间都会通过,因为在我们的情况下给出了大部分输入,但它也会call check_refname_format(...) on the right-hand side(即refs/heads/test:refs/remotes/<the remote name>/test部分{} {3}}没事。)

我想这意味着对于远程短名称也禁止分支和标签不允许的字符和字符序列。

答案 1 :(得分:3)

正如你和das-g所指出的那样,它没有记录在任何地方。但是,远程名称通常嵌入在远程跟踪分支名称中,因此git check-ref-format强制执行的所有约束通常都适用。

但是,check-ref-format代码中缺少一些相对较小的东西。分支名称仅包含来自集合[a-f]的字母,可能与数字混合,有时会变得模棱两可!例如,单词fade是一个非常好的英语动词。但是,它也是一个有效的十六进制数......并且所有Git对象都有一个160位的SHA-1哈希值,通常表示为40个字符的十六进制数,如e05806da9ec4aff8adfed142ab2a2b3b02e33c8c

还有一个&#34;缩写长度&#34;,通过core.abbrev设置,默认为7. 记录在git config中,但剩下的是什么没有记载的是,还有一个最小缩写长度,目前在4处编译并且不可配置(当值不可设置时,为什么源使用变量时不清楚) 。你可以使用哈希的缩写形式,只要它明确地选择一个特定的Git对象,所以如果master是上面那个丑陋的40个字符的哈希,你可以将其表达为e05806d,和Git经常会:

$ git reflog
e05806d HEAD@{0}: checkout: moving from ...

让我们注意,cab这个词,意思是出租车或出租车(或古希伯来语),也只包含来自&#34;十六进制数字的字母&#34;空格(所以它可以是数字3243,用十六进制表示,就像faded可能意味着1027565)。但是,由于cab 低于最小缩写长度为4,因此不会被视为十六进制数字,因此它会成为一个好的分支名称,或者远程名称。但是faded超过了最小缩写长度。

如果Git碰巧创建了一个完整的160位哈希序列faded开头的对象,那么名称​​ faded 就会变得模棱两可!

Git实际上开始尝试将对象ID解释为最小值(4),但是当它发生时,现在Git存储库中有两个e058提交 1 :< / p>

$ git show e058
error: short SHA1 e058 is ambiguous.
error: short SHA1 e058 is ambiguous.
fatal: ambiguous argument 'e058': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ git rev-list --all | grep '^e058'
e05806da9ec4aff8adfed142ab2a2b3b02e33c8c
e05881a4577cedca4d7456b3cb1f8bbd6f480df2
$ 

这意味着像fade这样一个非常好的词可能在一段时间内是一个有效的分支或远程名称(因为没有提交其ID以fade...开头的提交)。一旦 这样的提交,虽然名称仍然是格式中的有效分支名称,但某些Git命令可能会将其视为对象ID。我们可以通过创建一个名称与此commit-specifier e0580相同的分支来测试:

$ git branch e0580 e0580^
$ git show e0580
warning: refname 'e0580' is ambiguous.
commit af09003b2897db76cefdb08ab363ed68f2bb295b
Merge: 58fcd54 b22d748
[snip]
$ git branch -d e0580
Deleted branch e0580 (was af09003).

af09003e0580之前的提交,缩写为core.abbrev长度。测试显示分支名称通常在这里是首选,这很好,因为这些事情不会变得不明确,直到至少有一个匹配的提交。

但是,这会让我们看到git check-ref-format中遗失的一张支票。如果名称可能变得模棱两可,它可能应该发出警告,如果名称(a)可能变得模糊不清,并且(b)正好是40个字符,它肯定应警告或失败。原因是,如果名称​​ 正好长度为40个字符可以解释为SHA-1哈希值,则 被解释为SHA-1哈希。

sha1_name.c中,在第580行附近,Git包含一条消息,如果它遇到这些长度为40个字符的引用名称之一,则会打印出来。奇怪的是,refs.c中没有相应的测试。好像应该有。

1 实际上,有五个 e058 对象,但其中两个是blob,一个是树:

$ git rev-list --all --objects | grep '^e058'
e05806da9ec4aff8adfed142ab2a2b3b02e33c8c
e05881a4577cedca4d7456b3cb1f8bbd6f480df2
e058d184d1c072bd3078fe17ad41f1026f093201 t/t7008-grep-binary.sh
e05827cba5488fb0c45e7055194071e1fda0df13 Documentation
e058ad2324a89ad5e10a80acf947253eac6c41e1 
$ git cat-file -t e058ad2324a89ad5e10a80acf947253eac6c41e1
tree

Git的修订版解析代码接收消除信息&#34;消除歧义信息&#34;来自调用者,因此如果命令(例如git log)倾向于提交提交,Git只能选择那些提交的对象,跳过可能不明确的非提交对象。)

答案 2 :(得分:0)

您没有考虑过的极端情况:字符的 lack 对于远程名称也是非法的。

添加带有空字符串的新远程名称时,git将显示以下错误消息:

 fatal: '' is not a valid remote name\n

但是只有使用Git 2.20(2018年第四季度)时,卸下该遥控器时,您会收到一条正确的消息:

请参见commit 5025425Shulhan (shuLhan)(2018年9月13日)。
(由Junio C Hamano -- gitster --commit 00d5f66中合并,2018年9月24日)

  

builtin/remote:出现错误时引用远程名称以显示空名称

     

在删除以空字符串作为输入的远程名称时,git显示不带引号的空字符串:

fatal: No such remote: \n
     

要使这些错误消息保持一致,请引用遥控器的名称   我们尝试过但未能找到。

return error(_("No such remote: '%s'"), name);