Git uzak URL'si değiştirildikten sonra uzaktan reddedildi (sığ güncellemeye izin verilmiyor)


164

Git sürüm denetimi altında hem sunucuda hem de yerel bilgisayarımda çalıştığım bir projem var. Başlangıçta yerel bilgisayarım olarak uzak kökeni ayarladım ama şimdi bunu BitBucket olarak değiştirmek istiyorum.

Sunucuda şu komutu kullandım

git remote set-url origin bitbucket_address

Ama şimdi projemi zorlamaya çalıştığımda hatayı alıyorum

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

Buna neden olan nedir ve nasıl düzeltebilirim?


3
Yerel sürümünüzü nasıl klonladınız? git clone --depth?
Sascha Wolf

Bir süre önceydi ve hatırlayamıyorum. Öğrenmenin bir yolu var mı?
rwolst

2
Adlı bir dosya olmalıdır shallowsen .gitklasörü.
Sascha Wolf

Evet, bir shallowdosya görebiliyorum .
rwolst

Bkz stackoverflow.com/a/50996201 çözüm için bu sadece atar (ya yeniden yazar) eksik geçmişi
gak

Yanıtlar:


329

Görünüşe göre git clone --depth <number>yerel sürümünüzü klonlamıştınız. Bu sığ bir klon ile sonuçlanır . Böyle bir klonun bir sınırlaması, ondan yeni bir depoya zorlayamamanızdır.

Artık iki seçeneğiniz var:

  1. şu anki ya da eksik geçmişiniz umrunda değilse bu soruya bir göz atın
  2. tüm geçmişinizi saklamak istiyorsanız okumaya devam edin:

Yani, tarihini korumak istiyorsun, ha? Bu, deponuzu çözmemeniz gerektiği anlamına gelir . Bunu yapmak için eski uzaktan kumandanızı tekrar eklemeniz gerekir.

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

Bundan sonra git fetch, eski uzaktan kumandadan kalan geçmişi almak için kullanırız ( bu cevapta önerildiği gibi ).

git fetch --unshallow old

Ve şimdi yeni uzak deponuza girebilmelisiniz.


Not : Klonunuzu ayırmadan sonra eski uzaktan kumandayı tekrar çıkarabilirsiniz.


45
bir kick-start projesini klonladıysam ve tüm tarihi istemiyorsam / ihtiyacım yoksa? Bundan kaçınmanın bir yolu var mı?
itamar

9
@itamar Bu tamamen geçerli yeni bir soru için iyi bir örnek gibi görünüyor. Referans için bu soruya bağlantı verebilirsiniz.
Sascha Wolf


2
git fetch --unshallowTüm repodan ziyade sadece belirli bir dalı çözmek için bir refspec alabileceğinizi unutmayın . Örn:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke

5
Tamamen yeni bir repo oluşturmadan klonladığınız repodan biraz daha geride olan bir repo için bastırıyorsanız, yerel referansınızın uzak referansı içerecek kadar derin olması yeterlidir. Yani eğer origin/master20 kaydedilmesini ilerisinde oldu oldrepo/masterne zaman clone --depth 1'bunu ed, ve yapmak için, yeterli olacaktır yana 17 yerel hareketin yaptık git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(herhangi bir kapalı-birer hata için özür) ve sonra yapabileceğiniz git push oldrepo masterolaysız (git 1.9.0 veya daha yenisini gerektirebilir).
clacke

28

Reponuz originve orijinal repo ise upstream:

git fetch --unshallow upstream

bu benim için işe yarıyor ve üstteki cevaptan oldukça kolay.
Maosheng Wang

11

Repoyu sığ, ilk taahhüdünden bu yana eklediğiniz yeni taahhütlerle olduğu gibi tutmak istiyorsanız başka bir seçenek de: Bu taahhüdü etkileşimli bir rebase ile değiştirin .

  • İlk (kök) taahhüdü içeren etkileşimli bir yeniden taban oluşturma

    git rebase --interactive --root
    
  • Değişim pickbaşlangıçtaki için (s) işlemek editve dosyayı kaydedin ve kapatın.

    Repoyu 1'den büyük bir derinlikle klonladıysanız, tüm bu taahhütler için aynısını yapmanız gerekebilir. Alternatif olarak, fixupetkileşimli rebase sırasında bunların tümünü yürütün .

  • Bu taahhüdü düzenli ve

    git commit --amend --no-edit
    

    Bu işlem ayrıca taahhüt kimliğini değiştirecek ve sizi bu ilk taahhütte ortak yazar olarak ekleyecektir.

  • Rebase'inizi bitirmeyi unutmayın

    git rebase --continue
    

Teşekkür ederim! Orijinal depo silindiğinde ve yalnızca sığ bir kopyasına sahip olduğunuzda bir cazibe gibi çalıştı.
Vitalii Dmitriev

9

Yeni repoyu olduğu gibi itmek istiyorsanız, bunu deneyebilirsiniz:

  • Önce old git foldermevcut deponuzdan kaldırın ,sudo rm -rf .git
  • Sonra git'i yeniden başlatın git init
  • Ardından yeni uzaktan repoyu ekleyin git remote add your-new-repo
  • Sonra itin.

Bunu daha iyi bir çözüm buldum, çünkü eskisine zorlama gerektirmiyor. Bazen bu, kazan plakalarında olabilir.
rnpd


@NachPD Diğer çözümün "eskiye itilmesi" gerektiğini söylediğinizde ne demek istediğinizden emin değilim. Yani itmek yerine getirmeyi mi kastediyorsun? Çünkü bir itme gerektirmez.
Sascha Wolf

0

Getirilirse - unshallow çalışmaz. Şubenizde bazı sorunlar olmalı. Basmadan önce aşağıdaki komutla düzeltin.

git filter-branch -- --all

Bunu sadece --unshallow ile yapın, çünkü bir GÜVENLİK endişesi vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.