首页 > 解决方案 > git如何知道我在子目录中

问题描述

我注意到当我在 git 目录的子目录中时,它仍然能够识别父.git文件。它是如何工作的?

我的假设是,当我运行git status它时,它将在当前目录中搜索一个.git文件,如果它不存在,它将在父目录中搜索它。

它是否正确?

举个例子,我有这个目录布局:

~/folder/
    .git
    subfolder/
        subsubfolder/

如果我在子子文件夹内运行git status,它能够显示在 .git 中注册的文件更改。

标签: git

解决方案


我的假设是,当我运行git status它时,它将在当前目录中搜索一个.git文件,如果它不存在,它将在父目录中搜索它。它是否正确?

加上一些小的修正和很多警告,这确实是算法的核心。一些细节是特定于 Git 版本的,一些是依赖于操作系统的,还有一些是编译时选项。

与版本相关的次要更正.git可能需要成为目录(或文件夹,如果您更喜欢该术语)。我认为,拥有一个包含实际存储库目录路径名的.git 文件的能力与新git worktree代码大约在 Git 2.5 左右同时出现。

最大的警告是,如果GIT_DIR设置了环境变量,它必须包含将在其中找到存储库的路径名。设置时,Git 执行您描述的搜索方法:从当前工作目录开始(getcwd从 C 代码、os.getcwdPython 等),如果.git找不到,则上一层——加一层..,或剥离一层路径名组件——然后再试一次。搜索在以下情况下停止:

  • Git到达/所以没有更高的位置,或者
  • Git 到达一个文件系统挂载点,在那些拥有它并编译了它的系统上,并且GIT_DISCOVERY_ACROSS_FILESYSTEM没有设置环境变量。

前端命令,git实际上是这样做的,并GIT_DIR在环境中为底层实现命令设置,这样就不需要重复搜索。请注意,前端命令-C首先执行任何(更改目录)指令。因此,如果$GIT_DIR设置并包含相对路径名,则在指令运行后使用它。-C


推荐阅读