Remote ditolak (pembaruan dangkal tidak diizinkan) setelah mengubah URL remote Git

164

Saya memiliki proyek di bawah kontrol versi Git yang saya kerjakan pada server dan komputer lokal saya. Saya awalnya memiliki asal remote yang ditetapkan sebagai komputer lokal saya tetapi saya sekarang ingin mengubahnya ke BitBucket.

Di server saya menggunakan perintah

git remote set-url origin bitbucket_address

Tetapi sekarang ketika saya mencoba untuk mendorong proyek saya, saya mendapatkan kesalahan

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

Apa yang menyebabkan ini dan bagaimana cara memperbaikinya?

rwolst
sumber
3
Bagaimana Anda mengkloning versi lokal Anda? git clone --depth?
Sascha Wolf
Itu beberapa waktu yang lalu dan saya tidak ingat. Apakah ada cara untuk mengetahuinya?
rwolst
2
Seharusnya ada file bernama shallowdi .gitfolder Anda .
Sascha Wolf
Ya, saya bisa melihat shallowfile.
rwolst
Lihat stackoverflow.com/a/50996201 untuk solusi yang hanya membuang (atau menulis ulang) sejarah yang hilang
caw

Jawaban:

329

Sepertinya Anda sudah terbiasa git clone --depth <number>mengkloning versi lokal Anda. Ini menghasilkan klon yang dangkal . Salah satu batasan kloning tersebut adalah Anda tidak bisa mendorongnya ke repositori baru .

Anda sekarang memiliki dua opsi:

  1. jika Anda tidak peduli tentang riwayat Anda saat ini atau yang hilang, lihat pertanyaan ini
  2. jika Anda ingin menyimpan riwayat lengkap Anda, maka lanjutkan membaca:

Jadi, Anda ingin menyimpan sejarah Anda, kan? Ini berarti Anda harus membatalkan repositori Anda. Untuk melakukannya, Anda perlu menambahkan remote lama Anda lagi.

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

Setelah itu kami gunakan git fetchuntuk mengambil riwayat yang tersisa dari remote lama (seperti yang disarankan dalam jawaban ini ).

git fetch --unshallow old

Dan sekarang Anda harus bisa mendorong ke repositori jarak jauh baru Anda.


Catatan : Setelah menghapus klon Anda, Anda dapat menghapus remote yang lama lagi.

Sascha Wolf
sumber
45
bagaimana jika saya mengkloning proyek awal dan saya tidak ingin / perlu seluruh sejarah? apakah ada cara untuk menghindarinya?
itamar
9
@ Itamar Ini sepertinya contoh yang bagus untuk pertanyaan baru yang benar-benar valid. Anda dapat menautkan ke pertanyaan ini untuk referensi.
Sascha Wolf
14
Ditanyakan sebagai pertanyaan baru stackoverflow.com/questions/29748197/…
itamar
2
Catatan yang git fetch --unshallowdapat mengambil refspec hanya membatalkan unshow cabang tertentu daripada seluruh repo. Contoh:git fetch --unshallow origin refs/heads/mydeepbranch:refs/remotes/origin/mydeepbranch
clacke
5
Jika Anda mendorong ke repo yang sedikit di belakang repo apa pun yang Anda kloning, tidak membuat repo semua-baru, cukup bahwa referensi lokal Anda cukup dalam untuk mengandung referensi jarak jauh. Jadi, jika Anda origin/mastermemiliki 20 komitmen di depan oldrepo/masterketika Anda clone --depth 1mengeditnya, dan Anda telah membuat 17 komitmen lokal sejak itu, itu sudah cukup bagi Anda untuk melakukan git fetch --depth 37 origin refs/heads/master:refs/remotes/origin/master(permintaan maaf untuk kesalahan off-by-one), dan kemudian Anda dapat melakukannya git push oldrepo mastertanpa insiden (mungkin memerlukan git 1.9.0 atau lebih baru).
clacke
28

Dalam hal repo Anda origin, dan repo asli adalah upstream:

git fetch --unshallow upstream
Dorian
sumber
ini bekerja untuk saya, dan cukup mudah maka jawaban terpilih atas.
Maosheng Wang
11

Opsi lain jika Anda ingin mempertahankan repo seperti halnya dengan komit baru yang telah Anda tambahkan sejak awal, komit awal adalah ini: Ubah komit ini dengan rebase interaktif .

  • Mulai rebase interaktif termasuk komit (root) pertama dengan

    git rebase --interactive --root
    
  • Ubah pickkomitmen awal ke editdan simpan & tutup file.

    Jika Anda mengkloning repo dengan kedalaman lebih dari 1, Anda mungkin perlu melakukan hal yang sama untuk semua komitmen tersebut. Atau, sebagai alternatif, jalankan fixupuntuk semua ini selama rebase interaktif.

  • Konversi komit ini menjadi komit reguler dan tidak dangkal dengan

    git commit --amend --no-edit
    

    Ini juga akan mengubah ID komit dan menambahkan Anda sebagai penulis bersama untuk komit awal ini.

  • Jangan lupa untuk menyelesaikan rebase Anda

    git rebase --continue
    
Rene Hamburger
sumber
Terima kasih! Bekerja seperti mantra, ketika repositori asli dihapus dan Anda hanya memiliki salinannya yang dangkal.
Vitalii Dmitriev
9

Jika Anda ingin mendorong repo baru apa adanya, Anda dapat mencoba ini:

  • Pertama-tama hapus old git folderdari repo Anda saat ini,sudo rm -rf .git
  • Kemudian inisialisasi kembali git git init
  • Kemudian tambahkan repo jarak jauh yang baru git remote add your-new-repo
  • Lalu Dorong.
Akhter-uz-zaman
sumber
Saya menemukan ini solusi yang lebih baik, karena tidak memerlukan dorongan ke yang lama. Terkadang ini bisa terjadi dengan pelat ketel.
rnpd
Ini pada dasarnya adalah jawaban dari pertanyaan terkait yang dapat Anda temukan di sini .
Sascha Wolf
@NachPD Saya tidak yakin apa yang Anda maksud, ketika Anda mengatakan bahwa solusi lain membutuhkan "dorongan ke yang lama". Apakah maksud Anda mengambil alih-alih mendorong? Karena itu tidak memerlukan dorongan.
Sascha Wolf
0

Jika mengambil --unshallow tidak berfungsi. Pasti ada beberapa masalah dengan cabang Anda. Perbaiki dengan perintah berikut sebelum mendorongnya.

git filter-branch -- --all

Lakukan ini hanya dengan --unshallow tidak berfungsi karena ada masalah KESELAMATAN .

Chayapol
sumber