git rev-parse --git-path hooks 始终返回绝对路径

6

有没有等效的命令,总是返回绝对路径?

git rev-parse --git-path hooks

当我在子模块中时,我会得到一个绝对路径,但当我在根存储库中时,我会得到`.git/hooks`。

常规填充任意路径的方法是使用 readlinkpath=$(readlink -e "`git rev-parse --git-path hooks`") 应该可以完成。 如果你想要像 --absolute-git-dir rev-parse 参数一样创建一个 --absolute-git-path,我认为一个好的补丁会被接受。 - jthill
我尝试使用 --absolute-git-dir,但是遇到了一些问题。当我运行 git rev-parse --absolute-git-dir 时,它只会打印出 --absolute-git-dir。你知道为什么吗?不过 readlink 的解决方案似乎有效,谢谢! - Scotty H
这是一个全新的选项,在2.13版本中添加。顺便说一句,我认为readlink -nf比我上面展示的readlink -e更好。 - jthill
使用Git 2.31(2021年第一季度),您将拥有git rev-parse --path-format=absolute --git-path hooks命令。请查看我的回答 - VonC
2个回答

4

Git v2.13.0新增了--absolute-git-dir选项:

$ git rev-parse --absolute-git-dir
/Users/torek/...snip.../.git

但不包括 --absolute-git-path,正如您所指出的,--git-path 产生相对结果:

$ git rev-parse --git-path hooks
.git/hooks

如果您已经安装了Git 2.13,您可以使用sh/bash环境变量前缀方法将它们合并:

$ GIT_DIR=$(git rev-parse --absolute-git-dir) git rev-parse --git-path hooks
/Users/torek/...[snip].../.git/hooks

如果您的Git版本低于2.13,您可以使用readlink -f
$ GIT_DIR=$(readlink -f $(git rev-parse --git-dir)) git rev-parse --git-path hooks
/home/vagrant/...snip.../.git/hooks

(在我的笔记本电脑上的某个Linux镜像中,这个特定的Linux镜像已经安装了Git 2.7.4。)

0
在Git 2.31 (2021年第一季度)中, "git rev-parse"(man) 可以被明确地告知使用 --path-format=(absolute|relative)选项输出绝对或相对路径。

因此,如果您想确保输出绝对路径:

git rev-parse --path-format=absolute --git-path hooks

查看commit fac60b8commit be6e0da(2020年12月13日)由brian m. carlson (bk2204提交。
(由Junio C Hamano -- gitster --commit 9ba366f中合并,2021年1月15日)

rev-parse:添加绝对或相对路径格式选项

签名作者:brian m. carlson

git rev-parse(man)有几个选项可以打印各种路径。
其中一些路径是相对于当前工作目录打印的,而另一些则是绝对路径。
通常情况下,这不是问题,但有时候需要完全以一种格式或另一种格式呈现路径。
如果路径是规范的,则可以轻松完成此操作,但在某些缺乏realpath(1)的shell脚本环境和Go中,缺少适当规范化Windows上路径的函数,因此无法规范化路径。
为了帮助脚本编写者,让我们提供一个选项,该选项将使git rev-parse打印的大多数路径变成相对于当前工作目录或绝对且规范的路径。
记录哪些选项受到影响,哪些选项不受影响,以便用户不会感到困惑。
这种方法比提供既是相对路径又是绝对路径的现有选项的副本更加清洁和整洁。
请注意,如果用户需要两种形式,则可以在命令行中间传递附加选项,以更改后续操作的行为。

git rev-parse现在在其手册页面中包含:

--path-format=(absolute|relative)

控制某些其他选项的行为。

  • 如果指定为绝对路径,则这些选项打印的路径将是绝对路径和规范路径。
  • 如果指定为相对路径,则路径将相对于当前工作目录(如果可能)。
    默认值是特定于选项的。

此选项可以多次指定,并且仅影响在命令行上跟随它的参数,直到命令行的末尾或下一个此选项实例。

以下选项由--path-format修改:

git rev-parse现在在其手册页面中包含:

--show-toplevel

显示工作树的顶层目录(默认情况下为绝对路径)。
如果没有工作树,则报告错误。

git rev-parse现在在其手册页面中包括:

以下选项不受 --path-format 影响:

--absolute-git-dir

类似于 --git-dir,但其输出始终为规范化的绝对路径。

--is-inside-git-dir

当当前工作目录在仓库目录下方时,输出 "true",否则输出 "false"。

--is-inside-work-tree

当当前工作目录在仓库的工作树内时,输出 "true",否则输出 "false"。

--is-bare-repository

当仓库是裸仓库时,输出 "true",否则输出 "false"。

--is-shallow-repository

当仓库是浅克隆时,输出 "true",否则输出 "false"。

--show-cdup

当命令从子目录调用时,显示相对于当前目录的顶级目录路径(通常是一系列 "../" 或者空字符串)。

--show-prefix

当命令从子目录调用时,显示相对于顶级目录的当前目录路径。


警告:"rev-parse" 命令未诊断 "--path-format" 选项缺少参数的问题,该选项在 v2.31 时代引入:这已在 Git 2.32 (2021 年第二季度) 中得到纠正。

请参见 提交 99fc555(2021 年 5 月 17 日),作者为 Wolfgang Müller (wylfen)
(由 Junio C Hamano -- gitster -- 合并于 提交 99fe1c6,2021 年 5 月 22 日)

rev-parse:修复缺少--path-format参数导致的段错误

签名作者:Wolfgang Müller

调用 "git rev-parse --path-format"(man) 时,如果没有参数会导致段错误而不是给出错误消息。
提交 fac60b8 ("rev-parse: add option for absolute or relative path formatting", 2020-12-13, Git v2.31.0-rc0 -- merge listed in batch #2) 添加了参数解析代码,但忘记处理 NULL
在这里返回一个错误是有意义的,因为我们无法使用默认值。
添加一个测试用例进行验证。

错误信息现在将准确显示为:

fatal: --path-format requires an argument

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接