it-roy-ru.com

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

Есть идеи, как избавиться от этой ошибки?

ps. Я снова попытался клонировать репо, и похоже, что ошибка тоже в моем репозитории на Github. Итак, единственное, о чем я могу думать прямо сейчас, - это бросить репо и снова раскошелиться.

40
Galder Zamarreño

Проверьте .git/refs/remotes/Origin. Они там, и в верхнем течении их уже нет. Чтобы очистить пульты, которые больше не существуют, запустите

git remote Prune Origin

Вы также можете увидеть, что нужно сделать, добавив --dry-run перед тем, как делать это.

Надеюсь это поможет.

21
Adam Dymitruk

Я сталкиваюсь с этой ошибкой на регулярной основе. Git Remote Prune Origin не работает для меня.

[ Обновить. AFAIU, я сталкиваюсь с этой проблемой из-за использования git alternate. Скажем, у меня есть репо A, зарегистрированное как альтернативное для репо B. Когда я создаю новую ветку br в репо A и выбираю репо A как удаленное в репо B, git создаст удаленный ref .git/refs/remotes/A/br для новой ветки. Когда я удаляю ветку в репозитории A и после того, как соответствующий объект собирается для сбора мусора, я получаю сообщение «error: refs/remotes/A/br не указывает на действительный объект!» ]

Я написал этот скрипт (обновленный для работы с упакованными ссылками), чтобы удалить висячие ссылки (используя информацию в Проверить, если существует фиксация ).

#!/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
15
TdV

Ваш локальный клон, вероятно, в порядке, проблема в том, что в вашем репозитории GitHub отсутствуют объекты ветви t_1140.

У меня тоже была эта проблема, и поддержка GitHub устранила ее, я думаю, удалив refs/heads/t_1140 с их конца.

Обновление: Я снова получил ошибку с другой веткой, и я смог ее исправить, выполнив эту команду:

git Push Origin :refs/heads/t_ispn982_master

Вы должны получить предупреждение вроде этого:

remote: warning: Allowing deletion of corrupt ref.

но поврежденная ветка будет удалена

14
Dan Berindei

Вы говорите, что у вас есть:

также проверил .git/refs /глав и нет ссылки на t_1140

... что очень удивительно. Я вижу только, как эта ошибка возникнет, если файл .git/refs/heads/t_1140 существует. Возможно ли, что вы ошиблись по этому поводу?

Исправление: Чарльз Бейли указывает ниже, что ссылки могут быть упакованы, и в этом случае нет соответствующего файла в .git/refs/heads

3
Mark Longair

У меня была эта проблема при попытке клонировать некоторые репозитории 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'.
1
codemonkee

Сделайте текстовый поиск в вашей директории .git для вашей ветки

Используйте что-то вроде grep или findstr и удалите все экземпляры.

1
Cordell

Если это не с этим:

ошибка: не удалось запустить repack

Посмотрите в .git/packed-refs перечисленные ветви и удалите эти строки. Я перепробовал все другие решения, но это, наконец, решило это для меня.

1
Tarka

Я даю свои два цента для тех, кто использует Visual Studio . У меня была эта проблема, когда я пытался удалить локальную ветку и выполнил следующую команду через командную строку:

git branch -D <branchName>
0
Mari Faleiros

Это исправило это для меня:

git Push Origin :refs/remotes/Origin/[branch name]
git Push Origin :refs/heads/Origin/[branch name]

ВНИМАНИЕ: это удаляет ветку с сервера - любые изменения в этой ветке, которые не были объединены с другой ветвью, будут потеряны.

0
Frank Forte

У меня возникла эта проблема, и ни одно из предложенных выше средств не сработало . Поэтому я отредактировал .git/pack-refs и удалил строку, в которой упоминалась несуществующая ветвь . Все вдруг стало хорошо.

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

0
Eddy