Git tidak akan menginit / menyinkronkan / memperbarui submodul baru

113

Inilah bagian dari isi .gitmodulesfile saya :

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Namun, .git/confighanya berisi yang pertama:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Submodul kedua ( external/pyfacebook) telah ditambahkan oleh pengembang lain di cabang fitur. Saya telah mewarisi pengembangan sekarang, dan telah memeriksa cabang fitur. Namun, Git tidak akan menarik submodul untuk saya. Saya sudah mencoba:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Menghapus semua definisi submodul dari .git/configdan menjalankan git submodule init. Ini hanya menyalin submodul yang ada sebelumnya dan mengabaikan yang baru.
  • Memasukkan definisi submodul baru .git/configsecara manual dan berjalan git submodule update. Hanya submodul yang ada sebelumnya yang mau memperbarui.

dalam berbagai kombinasi, tetapi git tidak akan memperbarui .git/configberdasarkan konten baru .gitmodules, juga tidak akan membuat external/pyfacebookfolder dan menarik konten submodul.

Apa yang saya lewatkan? Apakah intervensi manual (menambahkan entri submodul dengan tangan .git/config) benar-benar diperlukan, dan mengapa?

Edit: Intervensi manual tidak bekerja. Menambahkan entri submodul baru secara manual ke .git/configtidak melakukan apa-apa. Submodul baru diabaikan.

David Eyk
sumber
1
menjalankan 1.7.7.1 dan memiliki masalah yang sama: "git submodule sync" tidak memperbarui .git / config setelah ada perubahan ke .gitmodules.
James Pritts

Jawaban:

92

Saya memiliki masalah yang sama - ternyata file .gitmodules telah dikomit, tetapi submodule sebenarnya melakukan (yaitu catatan ID komit submodul) tidak.

Menambahkannya secara manual sepertinya berhasil - misalnya:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Bahkan tanpa menghapus apa pun dari .git / config atau .gitmodules.)

Kemudian komit untuk merekam ID dengan benar.

Menambahkan beberapa komentar lebih lanjut ke jawaban yang berfungsi ini: Jika git submodule init atau git submodule update tidak berfungsi, maka seperti yang dijelaskan di atas git submodule add url harus melakukan triknya. Satu dapat memeriksa silang ini

 git config --list

dan seseorang harus mendapatkan entri dari submodule yang ingin Anda tarik sebagai hasil dari perintah git config --list. Jika ada entri submodule Anda di hasil config, maka sekarang update git submodule biasa --init harus menarik submodul Anda. Untuk menguji langkah ini, Anda dapat mengganti nama submodul secara manual, lalu memperbarui submodul tersebut.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Untuk mengetahui apakah Anda memiliki perubahan lokal pada submodule, dapat dilihat melalui git status -u (jika Anda ingin melihat perubahan pada submodule) atau git status --ignore-submodules (jika Anda tidak ingin melihat perubahan di submodul).

Dave James Miller
sumber
Apa external/pyfacebookuntuk?
IgorGanapolsky
2
@IgorGanapolsky Itulah jalur tujuan untuk submodul Anda.
yuhua
Ini membantu saya, terima kasih banyak! Saya hanya dapat menambahkan bahwa jika jalur tujuan sudah ada (yang terjadi pada saya sebagai hasil dari mencoba perintah lain) seseorang mendapat pesan berikut yang hanya menambah kebingungan:'your/local/path' already exists and is not a valid git repo
Michael Ambrus
1
satu baris untuk membaca entri dalam "git config --list":git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Puggan Se
64

git versi 2.7.4. Perintah ini memperbarui kode lokal git submodule update --init --force --remote

palik
sumber
20
Tidak melakukan apapun untukku.
Carlo Wood
1
berkenaan dengan git-submodule [dokumentasi) ( git-scm.com/docs/git-submodule#git-submodule---remote ) perintah yang disebutkan di atas harus memperbarui cabang lokal submodul.
palik
1
@palik Anda rock!
Denis Trofimov
1
Anda dapat memperbarui modul individu dengan git submodule update --init --force --remote <module-name>.
Adam Faryna
15

Memiliki masalah yang sama, ketika git diabaikan initdan updateperintah, dan tidak melakukan apa-apa.

BAGAIMANA CARA MEMPERBAIKI

  1. Folder submodul Anda harus dimasukkan ke dalam git repo
  2. Seharusnya tidak dalam .gitignore

Jika persyaratan itu terpenuhi, itu akan berhasil. Jika tidak, semua perintah akan dijalankan tanpa pesan dan hasil apa pun.

Jika Anda melakukan semua itu, dan tetap tidak berhasil:

  1. Tambahkan submodul secara manual, mis git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. komit dan dorong semua file - .gitmodulesdan folder modul Anda (perhatikan, konten folder itu tidak akan komit)
  5. jatuhkan repo git lokal Anda
  6. mengkloning yang baru
  7. pastikan .git/configbelum ada submodul
  8. Sekarang, git submodule init- dan Anda akan melihat pesan bahwa modul telah terdaftar
  9. git submodule update - akan mengambil modul
  10. Sekarang lihat .git/configdan Anda akan menemukan submodul terdaftar
Alex Ivasyuv
sumber
1
Saya yakin jalur ke submodul DAPAT berada di .gitignore. Setidaknya saya berhasil dengan mengikuti jawaban dari @DaveJamesMiller. Tidak ada yang berhasil untuk saya.
gebbissimo
7

Sepertinya ada banyak kebingungan di sini (juga) dalam jawabannya.

git submodule initadalah tidak dimaksudkan untuk secara ajaib menghasilkan barang-barang di git / config (dari .gitmodules). Ini dimaksudkan untuk menyiapkan sesuatu di subdirektori yang sepenuhnya kosong setelah mengkloning project induk, atau menarik komit yang menambahkan submodul yang sebelumnya tidak ada.

Dengan kata lain, Anda mengikuti git cloneproyek yang memiliki submodules (yang akan Anda ketahui dengan fakta bahwa klon memeriksa file .gitmodules) oleh a git submodule update --init --recursive.

Anda tidak mengikuti git submodule add ...dengan git submodule init(atau git submodule update --init), yang seharusnya tidak berhasil. Faktanya, penambahan sudah akan memperbarui .git / config yang sesuai jika semuanya berfungsi.

EDIT

Jika submodul git yang sebelumnya tidak ada ditambahkan oleh orang lain, dan Anda melakukan salah satu git pulldari komit itu, maka direktori submodul tersebut akan kosong seluruhnya (saat Anda menjalankan git submodule statushash submodul baru harus terlihat tetapi akan ada -di depannya itu.) Dalam hal ini Anda harus mengikuti git pulljuga Anda dengan git submodule update --init(plus --recursiveketika itu adalah submodul di dalam submodul) untuk mendapatkan submodul baru, yang sebelumnya tidak ada, diperiksa; seperti setelah klon awal proyek dengan submodul (di mana jelas Anda juga tidak memiliki submodul tersebut sebelumnya).

Carlo Wood
sumber
1
Itu menarik, karena git help submodulemengatakan ini tentang init: "init: Inisialisasi submodul yang dicatat dalam indeks (yang ditambahkan dan dilakukan di tempat lain) dengan menyalin nama dan url submodul dari .gitmodules ke .git / config." Jadi itu pasti terdengar seperti itu harus melakukan apa yang Anda katakan tidak dilakukan ...? Waktunya memperbarui dokumentasi git?
Brad
@brad Saya rasa saya tidak mengatakan itu - tetapi saya menambahkan klarifikasi untuk kasus khusus itu. Terima kasih.
Carlo Wood
@CarloWood ada ide mengapa penulis git submodules memutuskan bahwa --initharus diperlukan untuk mendapatkan submodul baru (daripada mengambilnya secara otomatis update)? Sepertinya memperbarui repositori Anda harus mengambil semua yang diperlukan kecuali itu akan menghancurkan data. Dengan --inititu memaksa Anda untuk mengetahui bahwa submodul baru mungkin telah dibuat, atau hanya selalu mengeluarkan --initsetiap kali, sekali lagi, tampaknya itu harus diaktifkan secara default.
Catskul
@Catskul Jelas saya tidak tahu mengapa penulis submodul git memutuskan sesuatu, tapi tebakan saya adalah bahwa "update" disediakan untuk memperbarui sesuatu yang sudah ada, dan "init" digunakan untuk membuat sesuatu (secara lokal) baru. Di bawah tenda, keduanya mungkin cukup berbeda secara signifikan untuk menjamin perintah yang berbeda.
Carlo Wood
6

Saya memiliki masalah yang sama tetapi tidak ada solusi di atas yang membantu. Entri dalam .gitmodules dan .git / config sudah benar tetapi perintah git submodules update --init --recursiveitu tidak melakukan apa-apa. Saya juga menghapus direktori submodule dan menjalankan git submodules update --init --recursivedan mendapatkan kembali direktori submodule tetapi dengan komit yang persis sama seperti sebelumnya.

Saya menemukan jawabannya di halaman ini . Perintahnya adalah:git submodule update --remote

masterop
sumber
2
Ini juga solusi yang tepat untuk saya. Saya berlari, git submodule updatebukan git submodule update --remote.
Andrew Medlin
5

Agak ajaib, tapi hari ini aku berlari git submodule initdiikuti git submodule syncdiikuti oleh git submodule updatedan itu mulai menarik submodulku ... Sihir? Mungkin! Ini benar-benar salah satu pengalaman paling menjengkelkan dengan Git…

Gores itu. Saya benar-benar berhasil melakukannya git submodule update --init --recursive. Semoga ini membantu.

PS: Pastikan Anda berada di direktori root git, bukan di submodule.

Levi Figueira
sumber
7
Nah ini sama sekali tidak ada artinya bagi saya.
IgorGanapolsky
@IgorGanapolsky Saya mengedit jawaban di atas dengan apa yang berhasil untuk saya. Beri tahu saya jika berhasil!
Levi Figueira
Saya mencoba perintah baru Anda, tetapi mereka juga tidak melakukan apa pun.
IgorGanapolsky
5

Berpikir bahwa pengaturan manual .gitmodulessudah cukup SALAH

Lokal saya git version 2.22.0pada tulisan ini.

Jadi saya datang ke utas ini bertanya-tanya mengapa tidak git submodule initberhasil; Saya mengatur .gitmodulesfile dan melanjutkan untuk melakukan git submodule init...

PENTING

  1. git submodule add company/project.git includes/projectadalah diperlukan (saat menambahkan modul untuk pertama kalinya), ini akan:

    • tambahkan konfigurasi ke .git/config
    • perbarui .gitmodulesfile
    • lacak lokasi submodul ( includes/projectdalam contoh ini).
  2. Anda kemudian harusgit commit setelah Anda menambahkan submodul, ini akan komit .gitmodulesdan lokasi submodul terlacak.

Ketika proyek di kloning lagi, itu akan memiliki .gitmodulesdan direktori submodul kosong (misalnya includes/projectdalam contoh ini). Pada titik .git/configini belum ada konfigurasi submodule, sampai git submodule initdijalankan, dan ingat ini hanya berfungsi karena .gitmodulesAND includes/projectdilacak di repo git utama.

Juga untuk referensi lihat:

farinspace
sumber
3

Saya memiliki masalah yang sama.

.gitmodulesmemiliki submodul, tetapi setelah git submodule initperintah tidak ada .git/config.

Ternyata developer yang menambahkan submodule juga menambahkan direktori submodule ke .gitignorefilenya. Itu tidak berhasil.

joseph.hainline
sumber
2

Sama seperti Anda, saya menemukan bahwa git submodule sync tidak melakukan apa yang Anda harapkan. Hanya setelah melakukan eksplisit git submodule addlagi, url submodule berubah.

Jadi, saya memasukkan skrip ini di ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

Dan saya juga menggunakan logika yang sama pada beberapa skrip git deploy pasca-terima.

Yang perlu saya lakukan sekarang adalah mengedit .gitmodules, lalu menjalankan skrip ini dan akhirnya berfungsi seperti yang saya kira git submodule sync.

Jumat
sumber
Ini tampaknya hanya terjadi pada beberapa repo ... mungkin karena beberapa bug di Git. Itu tidak pernah terjadi pada saya pada repositori yang baru dibuat untuk waktu yang lama, tetapi dahulu kala, itu biasa terjadi sepanjang waktu pada repo tertentu ...
Jumat
2

Saya memiliki masalah yang sama hari ini dan mengetahuinya karena saya mengetik git submodule initmaka saya memiliki baris itu di .git/config:

[submodule]
   active = .

Saya menghapusnya dan mengetik:

git submodule update --init --remote

Dan semuanya kembali normal, submodul saya diperbarui di subdirektori seperti biasa.

Eric Jeker
sumber
2

Masalah bagi saya adalah bahwa pengembang repo sebelumnya telah melakukan submodules/thingfolder itu hanya sebagai folder biasa, artinya ketika saya mencoba menjalankan git submodule add ..., itu akan gagal dengan:, 'submodules/thing' already exists in the indexnamun mencoba memperbarui submodul juga akan gagal karena melihat bahwa jalurnya tidak mengandung submodul.

Untuk memperbaikinya, saya harus menghapus submodules/thingfolder, melakukan penghapusan, lalu menjalankan git submodule addperintah untuk menambahkannya kembali dengan benar:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing
Venryx
sumber
1

Ketika saya melihat ini hari ini, seorang pengembang telah memindahkan sebagian dari pohon ke sub-direktori baru dan sepertinya klien git-nya tidak merekam aturan Subproyek yang diperbarui di pohon, sebaliknya mereka hanya nuked, meninggalkan .gitmodulesmerujuk keduanya ke basi lokasi dan subproyek yang tidak lagi ada di pohon saat ini.

Menambahkan kembali submodul, dan membandingkan commit shas dari submodule dengan yang ditemukan di git show $breaking_commit_sha(cari baris yang cocok dengan regexp ^-Subproject) untuk menyesuaikan sesuai kebutuhan.

Phil P.
sumber
1

Menghapus dir submodule dan isinya (folder "eksternal / pyfacebook") jika ada sebelumnya git submodule add ...dapat memperbaiki masalah.

atahan
sumber
1
Ini adalah masalah saya. Seseorang telah melakukan folder "submodule" hanya sebagai folder biasa, artinya ketika saya mencoba menjalankan "git submodule add ...", itu akan gagal dengan: "'vendor / mobx-state-tree' sudah ada di indeks" , namun mencoba memperbarui submodul juga akan gagal karena jalur tersebut tidak berisi submodul). Untuk memperbaikinya, saya harus menghapus folder, melakukan penghapusan, lalu menjalankan perintah git add untuk menambahkannya kembali dengan benar.
Venryx
1

Saya memiliki masalah serupa dengan submodul. Itu hanya tidak ingin dikloning / ditarik / diperbarui / apa pun.

Ketika mencoba menambahkan kembali submodul menggunakan git submodule add [email protected] destinationsaya mendapatkan output berikut:

A git directory for 'destination' is found locally with remote(s):
  origin        [email protected]
If you want to reuse this local git directory instead of cloning again from
  [email protected]
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Jadi, saya mencoba menerapkan perintah add :
git submodule add --force [email protected] destination

Itu berhasil dalam kasus saya.

Arvid
sumber
0

Sebagai catatan:
Saya membuat masalah yang sama dengan menambahkan repositori kosong sebagai submodule. Dalam kasus ini, tidak ada hash referensi yang tersedia untuk submodule, yang menyebabkan kesalahan yang dijelaskan oleh pengirim asli.

Menambahkan paksa repositori setelah berkomitmen untuk menyelesaikan masalah (seperti dalam posting Arvids)
git submodule add --force [email protected] destination

Marc
sumber
0
  • Hapus submodul dari Anda .git/config
  • Jalankan git submodule initperintah
  • Buka direktori submodul Anda dan jalankan git pull origin master

Ini harus bekerja sekarang

Masoud Darvishian
sumber
0

Hanya berbagi apa yang berhasil untuk saya:

git clone --recurse-submodules <repository path>

Ini mengkloning repositori jarak jauh yang sudah termasuk submodul. Ini berarti Anda tidak perlu menjalankan pembaruan submodul git atau init setelah kloning.

Anne Kariny Silva Freitas
sumber
0

Di bawah perintah sinkronisasi menyelesaikan masalah:

git submodule sync
Nishant Chauhan
sumber