git - git如何知道我在子目录中
问题描述
我注意到当我在 git 目录的子目录中时,它仍然能够识别父.git
文件。它是如何工作的?
我的假设是,当我运行git status
它时,它将在当前目录中搜索一个.git
文件,如果它不存在,它将在父目录中搜索它。
它是否正确?
举个例子,我有这个目录布局:
~/folder/
.git
subfolder/
subsubfolder/
如果我在子子文件夹内运行git status
,它能够显示在 .git 中注册的文件更改。
解决方案
我的假设是,当我运行
git status
它时,它将在当前目录中搜索一个.git
文件,如果它不存在,它将在父目录中搜索它。它是否正确?
加上一些小的修正和很多警告,这确实是算法的核心。一些细节是特定于 Git 版本的,一些是依赖于操作系统的,还有一些是编译时选项。
与版本相关的次要更正.git
可能需要成为目录(或文件夹,如果您更喜欢该术语)。我认为,拥有一个包含实际存储库目录路径名的.git
文件的能力与新git worktree
代码大约在 Git 2.5 左右同时出现。
最大的警告是,如果GIT_DIR
设置了环境变量,它必须包含将在其中找到存储库的路径名。未设置时,Git 执行您描述的搜索方法:从当前工作目录开始(getcwd
从 C 代码、os.getcwd
Python 等),如果.git
找不到,则上一层——加一层..
,或剥离一层路径名组件——然后再试一次。搜索在以下情况下停止:
- Git到达
/
所以没有更高的位置,或者 - Git 到达一个文件系统挂载点,在那些拥有它并编译了它的系统上,并且
GIT_DISCOVERY_ACROSS_FILESYSTEM
没有设置环境变量。
前端命令,git
实际上是这样做的,并GIT_DIR
在环境中为底层实现命令设置,这样就不需要重复搜索。请注意,前端命令-C
首先执行任何(更改目录)指令。因此,如果$GIT_DIR
设置并包含相对路径名,则在指令运行后使用它。-C
推荐阅读
- wordpress - 在 WooCommerce 中排除计算税的产品
- logstash - Logstash Grok 过滤器逗号 sep。细绳
- c# - 如何使用 Moq 设置数组元素?
- python - 为什么将列的值除以其他列在熊猫中创建数组?(我希望得到单个值)
- java - 打印机功能JavaFX的问题
- android - 我如何确定适合整个屏幕的字符数,我得到正确的屏幕宽度但字符宽度似乎关闭
- javascript - Javascript:将输入放在两个变量之间并输出
- java - 在 JavaFX 中使用 ComboBox 进行多选和取消选择
- haskell - 将存在主义提升到类型级别
- mysql - MYSQL 嵌套查询到 Laravel Eloquent ORM