Подтвердить что ты не робот

Избавление от "... не указывает на действительный объект" для старой ветки 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. Итак, единственное, что я могу сейчас подумать, - это снова перерезать репо и вилку.

4b9b3361

Ответ 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 и удалил строку, в которой упоминалась несуществующая ветвь. Внезапно все стало хорошо.

Должен любить эти читаемые человеком форматы файлов...