Apa arti dari pesan galat git “Server tidak mengizinkan permintaan untuk objek yang tidak diiklankan”?

23

Saya mencoba melakukan checkout dari github, dan saya mendapat pesan kesalahan ini:

[user@arch ~]$ git clone --recursive https://github.com/simsong/tcpflow.git
Cloning into 'tcpflow'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 4190, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 4190 (delta 21), reused 29 (delta 12), pack-reused 4146
Receiving objects: 100% (4190/4190), 50.27 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (2954/2954), done.
Submodule 'src/be13_api' (https://github.com/simsong/be13_api.git) registered for path 'src/be13_api'
Submodule 'src/dfxml' (https://github.com/simsong/dfxml.git) registered for path 'src/dfxml'
Submodule 'src/http-parser' (https://github.com/nodejs/http-parser.git) registered for path 'src/http-parser'
Cloning into '/home/user/tcpflow/src/be13_api'...
remote: Counting objects: 1203, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 1203 (delta 2), reused 5 (delta 1), pack-reused 1194
Receiving objects: 100% (1203/1203), 477.47 KiB | 1.96 MiB/s, done.
Resolving deltas: 100% (821/821), done.
Cloning into '/home/user/tcpflow/src/dfxml'...
remote: Counting objects: 1929, done.
remote: Total 1929 (delta 0), reused 0 (delta 0), pack-reused 1929
Receiving objects: 100% (1929/1929), 572.09 KiB | 2.89 MiB/s, done.
Resolving deltas: 100% (1294/1294), done.
Cloning into '/home/user/tcpflow/src/http-parser'...
remote: Counting objects: 1487, done.
remote: Total 1487 (delta 0), reused 0 (delta 0), pack-reused 1487
Receiving objects: 100% (1487/1487), 667.24 KiB | 2.46 MiB/s, done.
Resolving deltas: 100% (916/916), done.
Submodule path 'src/be13_api': checked out 'c81521d768bb78499c069fcd7c47adc8eee0350c'
Submodule path 'src/dfxml': checked out 'c31224626cf5f6678d42cbcfbfcd4e6191c9a864'
error: Server does not allow request for unadvertised object 5bbcdc5df9d01b521e8da011bab0da70bdec3653
Fetched in submodule path 'src/http-parser', but it did not contain 5bbcdc5df9d01b521e8da011bab0da70bdec3653. Direct fetching of that commit failed.
[user@arch ~]$

Jadi saya adalah pemilik repo-repo ini. Src / http-parser adalah garpu repo lain, dan pengelola repo itu secara konsisten tidak menerima permintaan tarikan saya (tanpa alasan yang diberikan) untuk menambahkan beberapa file yang dibuat secara otomatis ke .gitignorefile tersebut. Tapi saya pikir bukan itu masalahnya di sini.

ay32
sumber
Saya sudah mencoba perintah yang sama dan tidak ada kesalahan. Apakah Anda masih memiliki masalah? Btw dalam kasus saya memeriksa komit yang berbeda:Submodule path 'src/http-parser': checked out '6b05cce82da5c4d407e5576ab892bc20a17b0394'
ge0rdi
Masalahnya sudah hilang. Saya pikir itu berarti bahwa referensi submodule adalah untuk checkout yang tidak ada. Tapi saya tidak yakin.
vy32
Sebagai catatan untuk orang lain yang bingung tetapi pesan ini, dapat muncul jika Anda memperbarui submodule, memperbarui modul induk ke komit baru, dan tidak pernah mendorong komit baru di submodule. Maka, tentu saja, Anda akan kesulitan memeriksa komit yang tidak ada pada remote submodule!
Patrick Sanan
Masalahnya tampaknya saya memperbarui submodule, memperbarui repo induk, mendorong repo induk, tetapi tidak mendorong submodule. Jadi secara harfiah, repo induk mereferensikan komit yang tidak ada dalam repo submodule tentang github.
vy32

Jawaban:

8

jgit - Apa referensi yang diiklankan git? - Stack Overflow :

Selama pengambilan, server dapat membuat daftar referensi yang dimilikinya dan bahwa klien mungkin ingin mengambil. Ini adalah referensi yang diiklankan.

  • Sepertinya Anda tidak dapat secara langsung mendapatkan komit spesifik tunggal dari server, hanya referensi (yaitu cabang dan tag). Atau lebih tepatnya, server Github dikonfigurasikan untuk menolak permintaan semacam itu.
  • Jadi, jika Anda ingin mendapatkan komit tertentu --depth, itu harus paling banyak <depth>-1komit dari ref yang diambil (yang merupakan cabang / tag yang ditentukan dalam metadata submodule)

    Biasanya, orang menyarankan untuk hanya mengatur depthke beberapa nomor yang cukup besar tetapi masih jauh lebih kecil dari jumlah total komit di repo seperti 50atau 100. Misalnya 50apa yang digunakan Travis ketika melakukan klon awal untuk proyek.

Jika Anda tidak memperbarui submodule dengan --depth, gagal menemukan komit berarti salah satu dari:

  • pohon submodule dalam keadaan "dangkal" dan hal di atas berlaku (hanya mungkin ketika sebelumnya diperbarui dengan --depthatau entri masuknya .gitmodulestelahshallow = true )
  • komit tidak pada cabang yang digunakan submodule
  • komit sama sekali tidak dalam repo submodule:
    • baik seseorang melakukan kesalahan,
    • atau pernah ada di sana tetapi dihapus dengan dorongan paksa

Sebagai catatan, dalam kasus spesifik Anda, itu adalah kasus terakhir: komit 5bbcdc5df9d01b521e8da011bab0da70bdec3653sama sekali tidak ada dalam https://github.com/simsong/http-parser.gitrepo.

ivan_pozdeev
sumber
Apa depth?
vy32
@ vy32 menambahkan info untuk case ketika Anda tidak memperbarui dengan --depth.
ivan_pozdeev
"Pernah ada di sana tetapi dihapus dengan dorongan paksa" - apakah ada jalan lain dalam situasi ini?
skolsuper
1
@skolsuper memilih komit yang berbeda untuk diambil. Misalnya, jika itu adalah submodule, alihkan ke komit yang berbeda di proyek super.
ivan_pozdeev
3

Salah satu cara untuk mendapatkan akses ke objek yang tidak dikonversi adalah dengan menyinkronkan. Maka pembaruan submodule akan berfungsi, seperti:

git submodule sync --recursive
git submodule update
pemahat
sumber
1
+1 untuk kesederhanaan. bagi saya git submodule updategagal pada submodule lain, tetapi ketika saya menerapkan dua baris ini ke semua submodul saya dalam urutan yang benar , akhirnya berhasil.
Bizhan
2
Untuk proyek-proyek super berpotensi besar, Anda akan disarankan untuk benar-benar melaksanakan $ git submodule sync --recursive; git submodule updateATAU, jika hanya setelah kloning remote, baru saja $ git submodule update --init --recursive. Ini secara efektif akan melintasi pohon file proyek Anda dari /project/root/bawah, sesuai dengan apa yang ada di dalamnya /project/root/.gitmodules. Lebih banyak di $ git submodule --help...
Cbhihe
Terima kasih @Cbhihe saya akan mengedit jawaban untuk menyertakan --recursivebendera.
pengukir