Я предполагаю, что при запуске git status
он будет искать в текущем каталоге файл .git
и, если он не существует, будет искать его в родительском каталоге. Это правильно?
Что, с некоторыми незначительными исправлениями и лотом предостережений, действительно является сердцем алгоритма. Некоторые детали Git -version-speci c, некоторые зависят от ОС, а некоторые - параметры времени компиляции.
Незначительное исправление, зависящее от версии, заключается в том, что может потребоваться .git
быть каталогом (или папкой, если вы предпочитаете этот термин). Возможность иметь .git
файл , содержащий путь к действительному каталогу репозитория, пришла примерно в то же время, что и новый код git worktree
, примерно Git 2.5, я думаю.
Самое большое предостережение в том, что если установлена переменная окружения GIT_DIR
, она должна содержать путь, по которому будет найден репозиторий. Если установлено значение , а не , Git реализует метод поиска, который вы описали: запуск в текущем рабочем каталоге (getcwd
из C кода, os.getcwd
в Python и др. c ), и если .git
не может быть найдено, поднимитесь на один уровень - добавьте один ..
или уберите один компонент имени пути - и попробуйте снова. Поиск останавливается, когда:
- Git достигает
/
, поэтому нет более высокой позиции, или - Git достигает файловой системы точка монтирования в тех системах, в которых он есть и скомпилирован, а переменная окружения
GIT_DISCOVERY_ACROSS_FILESYSTEM
не установлена.
Команда переднего плана, git
, фактически делает это и устанавливает GIT_DIR
в среде для базовой команды реализации, так что поиск не нужно повторять. Обратите внимание, что команда переднего плана сначала выполняет любые директивы -C
(change-directory). Следовательно, если $GIT_DIR
установлено и содержит относительное имя пути, оно используется после директивы -C
.