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

57

Когда я запускаю git status в моем репо, я получаю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, Так может быть, мерзавец смущен?

@ nes1983 У меня есть несколько подмодулей, но эта проблема связана с основным репо. Josh Farneman
Ты вкладываешь git-репозитории? nes1983

Ваш Ответ

8   ответов
8

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

Восстановление после этой проблемы требует только двух небольших ручных правок для каждого подмодуля. Для меня это проще, чем повторно клонировать репозиторий и все его подмодули. Drew Noakes
@ JoshFarneman Как я (новичок) должен понимать, что ты сделал. Просьба предоставитьclear code до и после. так что можно понять, что требуется. alex
2

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

Источни

80

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

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

Так что, если вы переместили репо, абсолютный путь в этих двух файлах недопустим и вызывает ошибку «не git-репозиторий» Просто исправьте эти файлы вручную.

Просто обратите внимание, для меня файл конфигурации имеет относительный путь в отличие от файла .git. Loïc Faure-Lacroix
Я только что перешел с ПК на Mac, и у меня возникла та же проблема. Я обновил путь в этих двух файлах, и новый путь правильный, но я все еще получаюfatal: Not a git repository. В этом месте есть файл .git, так что, может быть, я что-то упустил? Jo Sprague
Спасибо, это хорошо сработало для меня. Однако второй путь был для меня немного короче:.git/modules/{submodule}/config (Я использую git версии 1.7.9.5 в Ubuntu) Drew Noakes
37

одуля. Решение заключается в следующем:

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

сбросив все git-подмодули с помощью

rm -rf .git/modules
git submodule update --init
Вау! Просто работал на меня! В моем случае я случайно сделал «rm -r» без подстановочных знаков. Он стер пару файлов из корня проекта, после чего их остановили из-за какого-то приглашения. Sankalp
4

Following @ ax003dотве, вы можете заменить все старые пути 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"
1

но после анализа двух файлов

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

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

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

Что этоmodule add git команда, о которой ты говоришь? Spencer Williams
0

1) Посмотрите в файл HEAD (в разделе .git) -> Если он поврежден (содержит некоторые случайные значения), замените содержимое этим текстом 'ref: refs /head /velop' (развернуть - последняя ветвь, над которой я работал на

2) try - git status.

3) Если шаг 2 не решил вашу проблему, попробуйте эти команды (может не работать для всех, но стоит попробовать)

rm -f .git / index git reset

4) git выдаст вам неподготовленные файлы после перезагрузки. оставить или выбросить согласно вашему желанию

Похожие вопросы