Как git узнает, что я нахожусь в подкаталоге - PullRequest
0 голосов
/ 16 марта 2020

Я заметил, что когда я нахожусь в подкаталоге каталога git, он все еще может распознать родительский файл .git. Как это работает?

Я предполагаю, что при запуске git status он будет искать в текущем каталоге файл .git и, если он не существует, будет искать его в родительском каталоге.

Это правильно?

Чтобы привести пример, у меня есть этот каталог:

~/folder/
    .git
    subfolder/
        subsubfolder/

Если я запускаю git status, находясь внутри подпапки, это возможность показать изменения файла, которые зарегистрированы в. git.

1 Ответ

2 голосов
/ 16 марта 2020

Я предполагаю, что при запуске 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...