Избавление от "... не указывает на действительный объект" для старой ветки git
У меня есть вилка репозитория Git, и мой клон, похоже, имеет проблему со старой, более не существующей ветвью. Я продолжаю видеть это сообщение:
error: refs/heads/t_1140 does not point to a valid object!
У меня нет других сообщений, и репо работает нормально. Там нет операции, которая мешает мне работать с другими ветвями, толкать изменения, тянуть... и т.д.
Я посмотрел вокруг и там было меньше четких инструкций о том, как обойти эту проблему. Я попытался выполнить git fsck --full
, но я не вижу ошибок. Просто загрузите сообщения dangling ...
.
Я также проверил свой .git/config
и там нет ссылок на эту ветку, а также проверил .git/refs/heads
и нет ссылки на t_1140
Любая идея, как избавиться от этой ошибки?
p.s Я попытался снова клонировать мое репо, и похоже, что ошибка - это мой репозиторий Github. Итак, единственное, что я могу сейчас подумать, - это снова перерезать репо и вилку.
Ответы
Ответ 1
Проверьте .git/refs/remotes/origin
. Они там, и в верхнем течении их уже нет. Чтобы очистить удаленные пульты, запустите
git remote prune origin
Вы также можете увидеть, что нужно сделать, добавив --dry-run
перед тем, как это сделать.
Ответ 2
Я регулярно сталкиваюсь с этой ошибкой. git удаленный источник черноты не работает для меня.
[Обновить. AFAIU, я столкнулся с этой проблемой из-за использования git alternate. Скажем, у меня есть repo A, зарегистрированный как альтернативный для repo B. Когда я создаю новую ветвь br в repo A и получаю repo A как удаленный в репо B, git создаст удаленный ref.git/refs/remotes/A/br для новой ветки. Когда я удаляю ветвь в репо А, и после того, как соответствующий объект будет собран с мусором, я получаю сообщение об ошибке: refs/remotes/A/br не указывает на действительный объект! ]
Я написал этот script (обновленный, чтобы иметь дело с упакованными ссылками), чтобы удалить оборванные ссылки (используя информацию в Подтвердить, если фиксация существует).
#!/bin/sh
set -e
if [ $# -eq 0 ]; then
dir="."
else
dir="$1"
fi
if [ ! -d "$dir" ]; then
echo "not a dir: $dir"
exit 1
fi
if [ ! -d "$dir/.git" ]; then
echo "not a git repo: $dir"
exit 1
fi
cd "$dir"
files=$(find .git/refs -type f)
for f in $files; do
id=$(cat "$f")
if ! git rev-parse --quiet "$id" \
>/dev/null 2>&1; then
continue
fi
if ! git rev-parse --quiet --verify "$id^{commit}" \
>/dev/null 2>&1; then
echo "Removing ref $f with missing commit $id"
rm "$f"
fi
done
if [ ! -f .git/packed-refs ]; then
exit 0
fi
packfiles=$(cat .git/packed-refs \
| grep -v '#' \
| awk '{print $2}')
for f in $packfiles; do
if ! git rev-parse --quiet --verify "$f" \
>/dev/null 2>&1; then
continue
fi
id=$(git rev-parse "$f")
if ! git rev-parse --quiet --verify "$id" \
>/dev/null 2>&1; then
continue
fi
if ! git rev-parse --quiet --verify "$id^{commit}" \
>/dev/null 2>&1; then
echo "Removing packed ref $f with missing commit $id"
git update-ref -d $f
fi
done
Ответ 3
Ваш локальный клон, вероятно, прекрасен, проблема в том, что объекты ветки t_1140
отсутствуют в вашем репозитории GitHub.
У меня тоже была эта проблема, и поддержка GitHub исправила ее, я думаю, удалив refs/heads/t_1140
с их конца.
Обновление: Я снова получил ошибку с другой веткой, и я смог ее исправить, выполнив эту команду:
git push origin :refs/heads/t_ispn982_master
Вы должны получить предупреждающее сообщение, подобное этому:
remote: warning: Allowing deletion of corrupt ref.
но поврежденная ветвь будет удалена
Ответ 4
Вы говорите, что у вас есть:
также отмечен .git/refs/heads и нет ссылки на t_1140
... что очень удивительно. Я могу только увидеть, как эта ошибка возникнет, если файл .git/refs/heads/t_1140
существует. Возможно ли, что вы ошиблись в этом?
Исправление: Чарльз Бейли указывает ниже, что refs могут быть упакованы, и в этом случае в файле .git/refs/heads
нет соответствующего файла,
Ответ 5
У меня возникла эта проблема при попытке клонирования некоторых репозиториев github, в системе, в которой я был, была запущена более старая версия git v1.7.4
, исправлено ее быстрое обновление.
remote: Counting objects: 533, done.
remote: Compressing objects: 100% (248/248), done.
remote: Total 533 (delta 232), reused 529 (delta 230)
Receiving objects: 100% (533/533), 121.36 KiB, done.
Resolving deltas: 100% (232/232), done.
error: refs/remotes/origin/master does not point to a valid object!
verror: Trying to write ref refs/heads/master with nonexistant object 0457f3e2e9432e07a1005f0f4161dc4b8215f128
fatal: Cannot update the ref 'HEAD'.
Ответ 6
Если это не удается:
Ошибка: не удалось запустить repack
Посмотрите .git/packed-refs
для указанной ветки (ов) и удалите эти строки. Я пробовал все другие решения, но это окончательно разрешило это для меня.
Ответ 7
Сделайте текстовый поиск в вашей директории .git для вашей ветки
Используйте что-то вроде grep
или findstr
и удалите все экземпляры.
Ответ 8
Я даю свои два цента для тех, кто использует Visual Studio.
У меня была эта проблема, пытаясь удалить локальную ветку и выполнив следующую команду через командную строку:
git branch -D <branchName>
Ответ 9
Это исправило это для меня:
git push origin :refs/remotes/origin/[branch name]
git push origin :refs/heads/origin/[branch name]
ВНИМАНИЕ: это удаляет ветку с сервера - любые изменения в этой ветке, которые не были объединены с другой ветвью, будут потеряны.
Ответ 10
У меня была эта проблема, и ни одно из предложенных выше средств не помогло. Поэтому я отредактировал .git/pack-refs и удалил строку, в которой упоминалась несуществующая ветвь. Внезапно все стало хорошо.
Должен любить эти читаемые человеком форматы файлов...