Избавление от «... не указывает на допустимый объект» для старой ветки git - PullRequest
41 голосов
/ 07 июня 2011

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

Ответы [ 10 ]

25 голосов
/ 07 июня 2011

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

git remote prune origin

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

17 голосов
/ 04 февраля 2015

Я постоянно сталкиваюсь с этой ошибкой.git remote prune origin не работает для меня.

[Обновление.AFAIU, я сталкиваюсь с этой проблемой из-за использования git alternate.Скажем, у меня есть репо A, зарегистрированное как альтернативное для репо B. Когда я создаю новую ветку br в репо A и выбираю репо A как удаленное в репо B, git создаст удаленный ref .git / refs / remotes / A/ br для новой ветки.Когда я удаляю ветку в репозитории A и после того, как соответствующий объект собирается мусором, я получаю сообщение об ошибке: 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
14 голосов
/ 09 июня 2011

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

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

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

git push origin :refs/heads/t_ispn982_master

Вы должны получить следующее предупреждение:

remote: warning: Allowing deletion of corrupt ref.

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

3 голосов
/ 09 июня 2011

Вы говорите, что имеете:

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

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

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

1 голос
/ 16 ноября 2017

Выполните текстовый поиск в каталоге .git для вашей ветки

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

1 голос
/ 18 июля 2017

Если с этим не получается:

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

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

1 голос
/ 21 октября 2014

У меня была эта проблема при попытке клонировать некоторые репозитории 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'.
0 голосов
/ 16 июля 2018

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

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

0 голосов
/ 25 января 2018

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

git push origin :refs/remotes/origin/[branch name]
git push origin :refs/heads/origin/[branch name]

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

0 голосов
/ 31 мая 2017

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

git branch -D <branchName>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...