Git статус возвращается фатально: не репозиторий git, а. git существует, и HEAD имеет соответствующие разрешения

Когда я запускаю статус git в своем репо, я получаю fatal: Not a git repository: /my repo/.git/modules/docs

Я проверил и .git существует и содержит HEAD с соответствующими разрешениями. Я могу выполнять различные другие команды в порядке. Если я запустил git gui, он отлично откроется и отобразит пару измененных файлов, но их не хватает.

Я предполагаю, что в HEAD может быть какая-то коррупция, но не уверен. Любая идея, как исправить это, не уничтожая все репо?

Обновление: я понял, что изменил имя каталога репо. Справочник, на который ссылается ошибка, - это старое имя каталога. Поэтому мой текущий репо находится в /new dir/.git, но ошибка говорит Not a git repository: /old dir/.git/modules/docs. Так может быть, git запутан?

Ответ 1

Наконец-то я выяснил, что проблема связана с проблемой с одним из подмодулей. Простое переименование каталога репо вызвало конфликт с этим подмодулем. После просмотра обсуждения в Как переименовать репозиторий git с помощью подмодулей? я понял, что клонирование репо - лучший способ пойти, вместо того чтобы переименовать каталог и что решил проблему с подмодулем.

Ответ 2

Эти два файла содержат абсолютный путь подмодуля:

{submodule}/.git
.git/modules/{submodule}/config

Итак, если вы переместили репо, абсолютный путь в этих двух файлах недействителен и выдает ошибку 'not a git repository'. Просто исправьте эти файлы вручную.

Ответ 3

В предыдущих версиях git использовался абсолютный путь для определения gitdir подмодуля. Решение выглядит следующим образом:

  • Обновите git до последней версии. Некоторые говорят, что вам понадобится хотя бы версия 1.7.10. Я просто решил проблему с помощью git 1.8.3.
  • Удалите все сломанные папки подмодулей: rm -rf broken_submodule_folder
  • Обновить зарегистрированные подмодули: git submodule update. Вы должны видеть, что подмодули проверяются.

Ответ 4

Следуя @ax003d answer, вы можете заменить все старые пути (old/path) новым путем (new/path) с помощью этой команды:

find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \)  -print0 | xargs -0 sed -i -e "s#old/path#new/path#g"

Возможно, вам захочется проверить, как выглядят старые пути, прежде чем заменять их:

find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \)  -print0 | xargs -0 grep --colour "old/path"

Ответ 5

Я решил эту проблему, переиздав все git -подстановки с

rm -rf .git/modules
git submodule update --init

Ответ 6

Я столкнулся с этой проблемой и с подмодулями, но после анализа двух файлов

{подмодуль}/. Мерзавец .git/модули/подмодули/{подмодуль}/конфигурации

Я понял, что в моем случае это не проблема.

После небольшого исследования я обнаружил, что в моем случае мне пришлось добавить git (команда: module add git), и ошибка исчезла.

Ответ 7

В моем случае проблема заключалась в том, что файл .git/HEAD нигде не указывал, он просто содержал последовательность странных символов. Я скопировал содержимое .git/ORIG_HEAD в .git/HEAD, и он снова работал.

Источник