Pertanyaan Git tidak akan meng-init / menyinkronkan / memperbarui submodul baru


Inilah bagian dari isi buku saya .gitmodules mengajukan:

[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/config hanya berisi yang pertama:

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

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

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Menghapus semua definisi submodul dari .git/config dan berlari git submodule init. Ini hanya menyalin atas submodule yang ada sebelumnya dan mengabaikan yang baru.
  • Memasukkan definisi submodule baru di .git/config secara manual dan berjalan git submodule update. Hanya submodul yang ada sebelumnya yang perlu diperbarui.

dalam berbagai kombinasi, tetapi git tidak akan diperbarui .git/config berdasarkan konten baru .gitmodules, juga tidak akan menciptakan external/pyfacebook folder dan tarik isi submodule.

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

Edit: Intervensi manual tidak berfungsi. Secara manual menambahkan entri submodule baru ke .git/config tidak melakukan apapun. Submodule baru diabaikan.


76
2017-07-26 16:47


asal


Jawaban:


Apakah Anda baru-baru ini meng-upgrade ke git versi 1.7.0.4? Saya lakukan dan sekarang memiliki masalah yang sama ...

Edit: Saya memperbaiki masalah saya tetapi sama sekali tidak tahu di mana masalahnya. Saya secara manual menghapus entri submodule dari keduanya. Git / config dan .gitmodules dan menambahkan kembali submodul saya dengan langkah ususal (git submodule menambahkan dll ...) ... Bentuk kerja tetapi tidak menambahkan nilai ke utas ini.


28
2017-08-26 16:10



Saya memiliki masalah yang sama - ternyata file .gitmodules dibuat, tetapi perintah submodule yang sebenarnya (yaitu catatan ID komitmen submodul) tidak.

Menambahkannya secara manual sepertinya melakukan trik - 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 mencatat ID dengan benar.

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

 git config --list

dan orang harus mendapatkan entri dari submodule yang ingin Anda tarik hasil dari perintah git config --list. Jika ada entri submodul Anda dalam hasil konfigurasi, maka sekarang pembaruan submodule git biasa --init harus menarik submodule Anda. Untuk menguji langkah ini, Anda dapat secara manual mengganti nama submodul dan kemudian memperbarui submodule.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

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


64
2018-01-28 23:58



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


34
2017-11-21 11:15



Punya masalah yang sama, ketika git diabaikan init dan update perintah, dan tidak melakukan apa-apa.

BAGAIMANA CARA MEMPERBAIKI

  1. Folder submodule Anda harus berkomitmen ke git repo
  2. Seharusnya tidak masuk .gitignore

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

Jika Anda melakukan semua itu, dan itu tetap tidak berfungsi:

  1. Tambahkan submodule secara manual, mis. git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. komit dan dorong semua file - .gitmodules dan folder modul Anda (perhatikan, bahwa isi folder tidak akan melakukan)
  5. jatuhkan repositori git lokal Anda
  6. klon yang baru
  7. memastikan bahwa .git/config belum memiliki submodul apa pun
  8. Sekarang, git submodule init - dan Anda akan melihat pesan yang terdaftar modul
  9. git submodule update - Akan mengambil modul
  10. Sekarang lihatlah .git/config dan Anda akan menemukan submodul terdaftar

14
2017-10-27 13:45



Semacam ajaib, tapi hari ini aku berlari git submodule init diikuti oleh    git submodule sync diikuti oleh git submodule update dan itu dimulai   menarik submodul saya ... Sihir? Mungkin! Ini benar-benar salah satu yang paling banyak   pengalaman menyebalkan 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 submodule.


3
2018-05-19 01:10



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

git submodule init aku s tidak dimaksudkan untuk secara ajaib menghasilkan barang di .git / config (dari .gitmodules). Ini dimaksudkan untuk mengatur sesuatu di subdirektori yang sepenuhnya kosong setelah mengkloning proyek induk, atau menarik komit yang menambahkan submodule yang sebelumnya tidak ada.

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

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

EDIT

Jika git submodule yang sebelumnya tidak ada ditambahkan oleh orang lain, dan Anda melakukan a git pull dari komit itu, maka direktori submodul itu akan sepenuhnya kosong (ketika Anda mengeksekusi git submodule status hash submodule baru harus terlihat tetapi akan memiliki - di depannya.) Dalam hal ini Anda harus mengikuti Anda git pull juga dengan git submodule update --init (plus --recursive ketika itu submodul di dalam submodule) untuk mendapatkan yang baru, sebelumnya tidak ada, submodul diperiksa; sama seperti setelah klon awal proyek dengan submodul (di mana jelas Anda tidak memiliki submodul sebelumnya baik sebelum).


3
2017-12-27 17:52



Menurut jawaban dari Dave James Miller saya dapat memastikan bahwa itu berhasil bagi saya. Yang penting di sini adalah melakukan ID komit proyek. Hanya memiliki entri di .gitmodules tidak cukup.

Berikut ini komit yang sesuai:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


2
2017-07-15 15:03



Saya memiliki masalah yang sama.

.gitmodules memiliki submodule, tetapi setelah git submodule init perintah itu tidak masuk .git/config.

Ternyata pengembang yang menambahkan submodul juga menambahkan direktori submodule ke .gitignore mengajukan. Itu tidak berhasil.


2
2018-01-28 03:44



Sama seperti Anda saya menemukan bahwa sinkronisasi submodul git tidak melakukan apa yang Anda harapkan untuk dilakukan. Hanya setelah melakukan eksplisit git submodule addlagi melakukan perubahan url submodule.

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

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

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

Yang harus saya lakukan sekarang adalah mengedit .gitmodules, kemudian jalankan skrip ini dan akhirnya berfungsi seperti yang saya pikirkan git submodule sync seharusnya.


2
2018-03-09 19:36



Ketika saya melihat ini hari ini, pengembang telah memindahkan bagian dari pohon ke dalam sub-direktori baru dan kelihatannya klien gitnya tidak mencatat aturan Subproyek yang diperbarui di pohon, sebaliknya mereka hanya nuked, meninggalkan .gitmodules merujuk baik ke lokasi basi dan ke subproyek yang tidak lagi ada di pohon saat ini.

Menambahkan submodul kembali, dan membandingkan sha commit dari submodul ke yang ditemukan di git show $breaking_commit_sha (cari baris yang cocok dengan regexp ^-Subproject) untuk menyesuaikan hal-hal yang diperlukan.


1
2018-04-30 21:00