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

164

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

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

git remote set-url origin bitbucket_address

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

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

Что вызывает это и как я могу это исправить?

rwolst
источник
3
Как вы клонировали свою локальную версию? git clone --depth?
Саша Вольф
Это было некоторое время назад, и я не могу вспомнить. Есть ли способ узнать?
rwolst
2
В shallowвашей .gitпапке должен быть файл с именем .
Саша Вольф
Да, я могу увидеть shallowфайл.
Rwolst
См. Stackoverflow.com/a/50996201 для решения, которое просто отбрасывает (или переписывает) отсутствующую историю
caw

Ответы:

329

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

Теперь у вас есть два варианта:

  1. если вас не волнует текущая или отсутствующая история, взгляните на этот вопрос
  2. если вы хотите сохранить свою полную историю, тогда продолжайте читать:

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

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

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

git fetch --unshallow old

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


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

Саша Волк
источник
45
Что, если я клонировал стартовый проект, и мне не нужна / не нужна вся история? Есть ли способ избежать этого?
Итамар
9
@itamar Это хороший пример для совершенно нового вопроса. Вы можете сослаться на этот вопрос для справки.
Саша Вольф
14
На вопрос как новый вопрос stackoverflow.com/questions/29748197/…
itamar
2
Обратите внимание, что git fetch --unshallowможет потребоваться refspec для отмены только определенной ветви, а не всего репо. Например:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
клик
5
Если вы подталкиваете к репо, который немного отстает от того, из которого вы клонировали репозиторий, а не создаете полностью новое репо, достаточно, чтобы ваша локальная ссылка была достаточно глубокой, чтобы содержать удаленную ссылку. Таким образом, если на момент вашего origin/masterредактирования вы получили на 20 коммитов больше, чем oldrepo/masterвы clone --depth 1, и с тех пор вы сделали 17 локальных коммитов, этого достаточно для вас git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(извинения за любую ошибку «за один раз»), и тогда вы можете делать это git push oldrepo masterбез происшествий. (может потребоваться git 1.9.0 или новее).
клик
28

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

git fetch --unshallow upstream
Дориан
источник
это работает для меня, и довольно легко, тогда как топ проголосовал ответ.
Маошен Ван
11

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

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

    git rebase --interactive --root
    
  • Измените pickисходную фиксацию editи сохраните и закройте файл.

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

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

    git commit --amend --no-edit
    

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

  • Не забудьте закончить ребаз

    git rebase --continue
    
Рене Гамбургер
источник
Спасибо! Сработало как талисман, когда исходный репозиторий был удален и у вас есть только его мелкая копия.
Виталий Дмитриев
9

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

  • Сначала удалите old git folderиз вашего текущего репо,sudo rm -rf .git
  • Затем инициализируйте GIT снова git init
  • Затем добавьте новый удаленный репо git remote add your-new-repo
  • Затем нажмите его.
Ахтер-уз-Заман
источник
Я нашел это лучшее решение, так как оно не требует толчка к старому. Иногда это может случиться с шаблонами.
августа
@NachPD Я не уверен, что вы имеете в виду, когда говорите, что другое решение требует «толчка к старому». Вы имеете в виду выборку вместо толчка? Потому что это не требует толчка.
Саша Вольф
0

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

git filter-branch -- --all

Делать это только с --unshallow не работает, так как есть проблема БЕЗОПАСНОСТИ .

Chayapol
источник