有没有办法找到Git仓库的工作树,给出它的.git目录?

 飞轶尘埃_130 发布于 2023-02-03 12:30

我正在为一些同事编写一个脚本,用于他们的Git存储库,我对如何可靠地找到repo工作树的根目录感到困惑:

通常,如果当前目录位于工作树内,则命令...

git rev-parse --git-dir
git rev-parse --show-toplevel

...将分别返回.git目录和工作树的根.然而,如果当前目录恰好是里面一个.git目录,那么只有第一个命令的作品.该命令git rev-parse --show-toplevel不显示工作树的顶层(至少,不适合我,在Linux上使用git 1.8.4.4).

假设git rev-parse --is-bare-repository的回报false,我通常会猜的父目录git rev-parse --git-dir或者是工作目录(或地方工作目录内),但如果用户GIT_DIR设置该.git目录不是工作目录里面,这是行不通的.(例如,当用户使用子模块时,他们的GIT_DIR可能不在他们的工作树中.)

我发现令人困惑的是,当在a内运行时GIT_DIR,git rev-parse --show-toplevel不会输出任何错误消息并返回0:

$ cd $(git rev-parse --git-dir); git rev-parse --show-toplevel ; echo $?
0

而在某个地方运行相同的命令显然不是git存储库会返回错误代码:

$ cd /; git rev-parse --show-toplevel ; echo $?
fatal: Not a git repository (or any of the parent directories): .git
128

如果有一种方法可以找到工作树GIT_DIR,有人可以告诉我如何...或者如果根本无法从.git目录中获取工作树的位置,请帮助我理解为什么,哲学上, .git目录不保留对其工作树的引用?

在此先感谢您的帮助/指针!

1 个回答
  • 为什么,哲学上,.git目录不保留对其工作树的引用?

    因为您可以在任何地方设置所述工作树(使用--work-tree选项或 GIT_WORK_TREE环境变量),包括在(并且它是目标)不包括.git文件夹的位置.

    git config手册页确实提到:

    该值可以是绝对路径,也可以是相对于.git目录路径的路径,该路径由--git-dir或指定GIT_DIR,或自动发现.
    如果--git-dirGIT_DIR指定了但没有--work-tree,GIT_WORK_TREEcore.worktree被指定,当前的工作目录被认为是你的工作树的最高水平.

    所以它更像是一个基于工作树文件夹的约定(为了找到它.git)而不是反向(从.git文件夹中推导出工作树).

    话虽这么说,我列出了所有可以让你了解工作树文件夹的命令," 当我可能在子目录中时如何找到本地git存储库的路径 ".

    2023-02-03 12:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有