Почему git log/status не возвращает результат?
У меня есть очень старый репозиторий git (около шести лет) и заметил, что я не вижу изменений, которые я сделал для файла в моем git status
выходе.
Я запустил команду в соответствующем файле:
$ git status Data/schema.sql
$
и не получил выход! Этот файл находится в репо с самого начала. Кроме того, если я проверяю репо на другой каталог, там появляется файл (как ни странно).
Я видел то же самое с git diff Data/schema.sql
и git log Data/schema.sql
.
Обычно, когда что-то подобное происходит, это проблема gitignore
. Но даже удаление моего файла .gitignore
не вызвало никаких изменений в этом поведении.
Что может вызвать это поведение?
Ответы
Ответ 1
Этот "симптом" имеет два возможных "диагноза":
Нечувствительная к регистру принудительное переименование в истории
Диагностика:
git ls-files
Поиск путей с разными заглавными буквами:
some/path/foo
Some/path/bar
Решение
git mv -f Some/path/* some/path/
Важно переместить все файлы (/*
) на переименованный путь. Теперь у всех будет один путь.
Возможная причина
Может возникнуть ситуация, когда some/path
имеет несколько файлов с ней, отслеживаемых с разными буквами в пути. Для таких файлов, обеспечивающих "неправильный" путь к git log
или git status
, получается абзацция некоторых коммитов в выходе журнала.
Эта ошибка воспроизводится с git mv -f <path/file> <PATH/file>
на Git 1.9.5 и, возможно, на более новых версиях (будет проверяться позже).
git log Some/path/foo
В журнале не содержатся некоторые коммиты, сделанные до выполнения git mv -f some/path/bar Some/path/bar
.
Файлы, помеченные знаком skip-worktree
или assume-unchanged bit
Спасибо @Zeeker за это предположение.
Диагностика:
git ls-files -v | grep -E '^(S|[a-z])'
За дополнительной информацией обратитесь к git ls-files
документации.
Ответ 2
TL; DR: проверить наличие других запущенных git-клиентов.
У меня просто была похожая проблема: нулевой вывод из git.
git status
, git log
, git fetch
: все то же самое. Ничего такого. Пустая строка и обратно в командную строку.
Я получал ответы только тогда, когда был в родительском каталоге, который не был репозиторием или в другом репозитории. Кроме того, я получил ошибки и предложения для неправильно набранных команд. Так что это было не совсем мертвым. Просто в спящем режиме - или что-то.
Первый ответ, который я нашел, был для git branches
которые правильно печатали известные ветки. Поэтому я играл с ветками и использовал git checkout master
который мне ничего не дал, и все вышеперечисленные команды не изменились. Все ничего. Когда я попытался вернуться к develop
я понял:
fatal: Unable to create 'I:/foo/bar/repo/.git/index.lock': File exists.
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
Я нашел запущенный git-UI-клиент (в моем случае GitKraken) и закрыл его. Исправлена. Возможно, проблема как-то связана с тем, что мое хранилище было в сетевой папке Windows.
Ответ 3
Я делал git log
в самой глубокой папке в Windows. не работал поэтому я попробовал git ls-files
. это тоже не работало
Я просматривал папки достаточно много раз, пока git ls-files
работали, а затем использовал git log
с относительным путем к файлу.
Я понятия не имею, что вызывает это, но это решило проблему для меня. (хотя бы временно)