Після зміни віддаленої URL-адреси Git віддалене відхилення (дрібне оновлення не дозволено)


164

У мене є проект під контролем версій Git, який я працював як на сервері, так і на моєму локальному комп’ютері. Спочатку у мене віддалене джерело було встановлено як мій локальний комп'ютер, але тепер я хотів би змінити це на BitBucket.

На сервері я використовував команду

git remote set-url origin bitbucket_address

Але тепер, коли я намагаюся підштовхнути свій проект, я отримую помилку

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

Що викликає це і як це виправити?


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
що робити, якщо я клонував стартовий проект, і я не хочу / потребую всієї історії? чи є спосіб уникнути цього?
itamar

9
@itamar Це здається хорошим прикладом для абсолютно актуального нового питання. Ви можете посилання на це питання для довідки.
Саша Вовк

14
Відповідаючи на питання , як новий питання stackoverflow.com/questions/29748197 / ...
Ітамар

2
Зауважте, що git fetch --unshallowможна заздалегідь переглянути лише видалення певної гілки, а не цілого репо. Напр .:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke

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

Ще один варіант, якщо ви хочете зберегти репо, як це було з новими зобов’язаннями, які ви додали з мілкої, початкової фіксації, це така: Змініть цю комісію за допомогою інтерактивної бази даних .

  • Запустіть інтерактивну базу даних, включаючи першу (root) команду

    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
  • Потім натисніть на нього.

Я вважав це кращим рішенням, оскільки воно не потребує поштовху до старого. Іноді це може статися з котельними плитами.
rnpd


@NachPD Я не впевнений, що ти маєш на увазі, коли ти кажеш, що інше рішення вимагає "натиску на старе". Ви маєте на увазі підбір замість поштовху? Тому що це не вимагає поштовху.
Саша Вовк

0

Якщо отримання - не працює, не працює. З вашою філією мають бути деякі проблеми. Виправте її за допомогою наступної команди, перш ніж натискати на неї.

git filter-branch -- --all

Зробити це потрібно лише за допомогою - не зачиняється, оскільки виникає проблема БЕЗПЕКИ .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.