Удаленный отклонен (мелкое обновление не разрешено) после изменения удаленного URL Git

У меня есть проект под управлением версией Git, который я работал как на сервере, так и на моем локальном компьютере. Первоначально я установил удаленный источник в качестве локального компьютера, но теперь я хотел бы изменить его на BitBucket.

На сервере я использовал команду

git remote set-url origin bitbucket_address

Но теперь, когда я пытаюсь продвинуть свой проект, я получаю ошибку

 ! [remote rejected] master -> master (shallow update not allowed)

Что является причиной этого и как я могу это исправить?

11 ответов

Решение

Как вы уже использовали git clone --depth <number> клонировать вашу локальную версию. Это приводит к мелкому клону. Одним из ограничений такого клона является то, что вы не можете перенести его в новый репозиторий.

Это означает, что вы должны закрыть свой репозиторий. Для этого вам нужно будет снова добавить свой старый пульт.

git remote add old <path-to-old-remote>

После этого мы используем git fetch извлечь оставшуюся историю из старого пульта (как предложено в этом ответе).

git fetch --unshallow old

И теперь вы сможете войти в свой новый удаленный репозиторий.


Примечание. После отказа от клона вы, очевидно, можете снова удалить старый пульт.

Если ваш репо originи оригинал репо upstream:

git fetch --unshallow upstream

Другой вариант, если вы хотите сохранить репо как есть с новыми коммитами, которые вы добавили после мелкой, начальной фиксации, это: Поправьте этот коммит с помощью интерактивной перебазировки.

  • Начать интерактивную перебазировку, включая первый (корневой) коммит с

    git rebase --interactive --root
    
  • Изменить pick первоначального коммита (ов) для edit и сохраните и закройте файл.

  • Преобразуйте этот коммит в обычный, неглубокий коммит с

    git commit --amend --no-edit
    

Это также изменит идентификатор фиксации и добавит вас в качестве соавтора к этой первоначальной фиксации.

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

Если вы хотите запустить новый репо как есть, вы можете попробовать это:

  • Сначала удалите old git folder из вашего текущего репо,sudo rm -rf .git
  • Затем инициализируйте GIT снова git init
  • Затем добавьте новый удаленный репо git remote add your-new-repo
  • Затем нажмите его.

Если получение --unshallow не работает. Должны быть проблемы с вашей веткой. Прежде чем нажимать, исправьте его с помощью следующей команды.

git filter-branch -- --all

Делать это только с --unshallow не работает из соображений БЕЗОПАСНОСТИ.

В случае конвейера битбакета

Это может быть связано с ограниченной глубиной фиксации (по умолчанию 50 коммитов).

Вы можете увеличить лимит

      clone:
  depth: 500       # include the last five hundred commits
  
pipelines:
  default:
    - step:
        name: Cloning
        script:
          - echo "Clone all the things!"

Примечание. Используйте depth: full без ограничений.

Я исправил эту проблему. но, возможно, вы не можете это исправить. решение следующим образом.

  1. получить мелкий файл из git, например common/.git/shallow
  2. поместите этот файл в каталог .git на сервере git.
  3. отправьте свою ветку на сервер git.

В моей компании мне нужен ИТ-администратор, чтобы добавить файл, а у меня нет разрешений.

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

Добавить в свой .gitconfig:

[alias]
    unshallow = !"git fetch --unshallow \"${1:-origin}\" # Unshallow from remote $1 (defaults to origin)"

Применение:

  • git unshallow # unshallow текущая ветвь на основе origin удаленный
  • git unshallow other-remote # unshallow текущая ветвь с удаленного other-remote

2021 6 октября

Для простого решения этой проблемы, если вас не интересуют существующие удаленные изменения, сделайте это следующим образом.

  1. Удалите свой местный .git папку из вашего репозитория.
  2. Тип git init.
  3. Добавьте свой пульт снова git remote add origin <REMOTE_URL>.
  4. Установленный main ветвь по git branch -M main.
  5. Продвиньте свои изменения тогда git push --set-upstream origin main.

Тада;) 🎉

Если у вас нет доступа к старому репозиторию, вы можете использовать

  1. git rebase -i --root
  2. при первом изменении фиксации pick к edit
  3. git commit --amend --no-edit
  4. git rebase --continue

После вашего мерзавца будет думать, что не мелко.

источник. Как исправить мелкое обновление, не разрешенное в git

Просто удалитеshallowфайл в вашем /.git/shallow

Теперь это должно работать.

Другие вопросы по тегам