【问题标题】:Is there a way to find the work-tree of a Git repo, given its .git directory?给定 .git 目录,有没有办法找到 Git 存储库的工作树?
【发布时间】:2014-01-13 06:42:57
【问题描述】:

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

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

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

...将分别返回.git 目录和工作树的根。但是,如果当前目录恰好在 inside .git 目录中,则只有 first 命令有效。命令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 可能不在他们的工作树中。)

我感到困惑的是,当在 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 目录没有保留对其工作树的引用?

提前感谢您的帮助/指点!

【问题讨论】:

    标签: git


    【解决方案1】:

    从哲学上讲,为什么 .git 目录不保留对其工作树的引用?

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

    git config man page 确实提到:

    该值可以是绝对路径,也可以是相对于.git 目录的路径,该路径可以由--git-dirGIT_DIR 指定,也可以是自动发现的。
    如果指定了--git-dirGIT_DIR,但没有指定--work-treeGIT_WORK_TREEcore.worktree,则将当前工作目录视为工作树的顶层。

    所以它更多的是基于工作树文件夹的约定(为了找到.git)而不是相反(从.git 文件夹推导出工作树)。

    话虽如此,我列出了所有可以让您了解“How to find the path of the local git repository when I am possibly in a subdirectory”中的工作树文件夹的命令。

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 2010-12-17
      • 2012-02-22
      • 1970-01-01
      • 2014-07-29
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多