Git yeni alt modülleri başlatmayacak / senkronize etmeyecek / güncellemeyecek


113

Dosyamın içeriğinin bir kısmı .gitmodules:

[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

Ancak, .git/configyalnızca ilkini içerir:

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

İkinci alt modül ( external/pyfacebook), bir özellik dalında başka bir geliştirici tarafından eklenmiştir. Şimdi geliştirmeyi devraldım ve özellik dalını kontrol ettim. Ancak Git alt modülü benim için çekmeyecek. Denedim:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Tüm alt modül tanımlarının kaldırılması .git/configve çalıştırılması git submodule init. Yalnızca daha önce var olan alt modülün üzerine kopyalar ve yenisini yok sayar.
  • Yeni alt modül tanımlarının .git/configmanuel olarak girilmesi ve çalıştırılması git submodule update. Yalnızca önceden var olan alt modüller güncelleme zahmetine katılır.

çeşitli kombinasyonlarda, ancak git .git/configyeni içeriğine göre güncellenmeyecek .gitmodules, external/pyfacebookklasörü oluşturmayacak ve alt modülün içeriğini çekmeyecektir.

Neyi kaçırıyorum? Manuel müdahale (el ile bir alt modül girişi eklemek .git/config) gerçekten gerekli midir ve neden?

Düzenleme: Manuel müdahale çalışmıyor. Yeni alt modül girişini manuel olarak eklemek .git/configbir şey yapmaz. Yeni alt modül yok sayılır.


1
1.7.7.1 çalıştırıyor ve aynı sorunu yaşıyor: "git submodule sync", .gitmodules'e yapılan bir değişiklikten sonra .git / config'i güncellemiyor.
James Pritts

Yanıtlar:


92

Aynı sorunu yaşadım - .gitmodules dosyasının kaydedildiği ortaya çıktı, ancak gerçek alt modül kaydı (yani, alt modülün commit kimliğinin kaydı) değildi.

Bunu manuel olarak eklemek işe yaramış görünüyordu - örneğin:

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

(.Git / config veya .gitmodules'ten hiçbir şey kaldırmadan bile.)

Ardından kimliği doğru şekilde kaydetmek için taahhüt edin.

Bu çalışan yanıta bazı yorumların eklenmesi: git alt modülü init veya git alt modülü güncellemesi çalışmazsa, yukarıda açıklandığı gibi git alt modülü ekle url hile yapmalıdır. Bunu şu şekilde kontrol edebilirsiniz:

 git config --list

ve git config --list komutunun sonucunda çekmek istediğiniz alt modülün bir girişini almalısınız. Yapılandırma sonucunda alt modülünüzün bir girişi varsa, o zaman artık normal git alt modülü güncellemesi --init alt modülünüzü çekmelidir. Bu adımı test etmek için, alt modülü manuel olarak yeniden adlandırabilir ve ardından alt modülü güncelleyebilirsiniz.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Alt modülde yerel değişiklikler olup olmadığını öğrenmek için, git status -u (alt modüldeki değişiklikleri görmek istiyorsanız) veya git status --ignore-submodules (içindeki değişiklikleri görmek istemiyorsanız) aracılığıyla görülebilir. alt modül).


Ne external/pyfacebookiçin?
IgorGanapolsky

2
@IgorGanapolsky Alt modülünüz için hedef yol budur.
yuhua

Bu bana yardımcı oldu, çok teşekkürler! Sadece hedef yol zaten mevcutsa (diğer komutları denemenin bir sonucu olarak benim için yaptı) şu mesajı aldığını ekleyebilirim:'your/local/path' already exists and is not a valid git repo
Michael Ambrus

1
"git config --list" içindeki girişleri git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
okumak için bir satır

64

git sürüm 2.7.4. Bu komut yerel kodu günceller git submodule update --init --force --remote


20
Benim için hiçbir şey yapmıyorsun.
Carlo Wood

1
git-submodule [dokümantasyon) ( git-scm.com/docs/git-submodule#git-submodule---remote ) ile ilgili olarak , yukarıda bahsedilen komut, alt modüllerin yerel dalını güncellemelidir.
palik

1
@palik sen rock!
Denis Trofimov

1
Tek tek modülü ile güncelleyebilirsiniz git submodule update --init --force --remote <module-name>.
Adam Faryna

15

Git yok sayıldığında initve updatekomut verdiğinde ve hiçbir şey yapmadığında aynı sorunu yaşadım .

NASIL DÜZELTİLİR

  1. Alt modül klasörünüz git repo'ya kaydedilmelidir
  2. .Gitignore içinde olmamalıdır

Bu gereksinimler karşılanırsa işe yarayacaktır. Aksi takdirde, tüm komutlar herhangi bir mesaj ve sonuç olmadan yürütülür.

Bunların hepsini yaptıysanız ve hala çalışmıyorsa:

  1. Alt modülü manuel olarak ekleyin, örn. git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. tüm dosyaları işle ve it - .gitmodulesve modül klasörünü (not, klasör içeriğinin teslim edilmeyeceğini unutma)
  5. yerel git deponuzu bırakın
  6. yenisini klonla
  7. .git/confighenüz herhangi bir alt modüle sahip olmadığından emin olun
  8. Şimdi, git submodule init- ve modülün kaydedildiği bir mesaj göreceksiniz
  9. git submodule update - modülü getirecek
  10. Şimdi bakın .git/configve kayıtlı alt modülü bulacaksınız

1
Alt modüllere giden yolun .gitignore biçiminde olabileceğine inanıyorum. En azından @DaveJamesMiller'den gelen cevabı takip ederek çalıştırdım. Benim için başka hiçbir şey işe yaramadı.
gebbissimo

7

Burada (ayrıca) cevaplarda çok fazla kafa karışıklığı var gibi görünüyor.

git submodule initolduğu değil sihirli bir şeyler oluşturmak için tasarlanmıştır .git / yapılandırma (.gitmodules itibaren). Ana projeyi klonladıktan sonra veya daha önce var olmayan bir alt modülü ekleyen bir commit çekildikten sonra tamamen boş bir alt dizinde bir şey ayarlanması amaçlanmıştır.

Başka bir deyişle, git clonealt modülleri olan bir projeyi (klonun bir .gitmodules dosyasını teslim aldığından bileceğiniz) bir git submodule update --init --recursive.

Sen do not izleyin git submodule add ...bir ile git submodule init(ya da git submodule update --init), o işin olmaması gerekir. Aslında, işler işe yararsa, eklenti zaten uygun .git / config dosyasını güncelleyecektir.

DÜZENLE

Önceden var olmayan bir git alt modülü başka biri tarafından eklendiyse ve bu işlemden birini yaparsanız git pull, bu alt modülün dizini tamamen boş olacaktır ( git submodule statusyeni alt modülün karmasını çalıştırdığınızda görünür olmalı, ancak -önünde bir it.) Bu durumda , yeni, daha önce mevcut olmayan alt modülü kullanıma almak için git pullbir git submodule update --init(artı --recursivebir alt modül içindeki bir alt modül olduğunda) ile de izlemeniz gerekir ; tıpkı alt modülleri olan bir projenin ilk klonundan sonra olduğu gibi (açıkçası bu alt modüllere daha önce de sahip değildiniz).


1
Bu ilginç, çünkü git help submoduleinit hakkında şunu söylüyor: "init: .gitmodules'den .git / config'e alt modül adlarını ve url'leri kopyalayarak dizine kaydedilen alt modülleri (başka yerde eklenen ve işlenen) başlatın." Emin Yani sesler tam olarak bunu yapmaz dediklerini yapmak gerektiği gibi ...? Git belgelerinde güncelleme zamanı mı?
Brad

@brad Bunu söylediğimi sanmıyorum - ama bu özel durum için bir açıklama ekledim. Teşekkürler.
Carlo Wood

@CarloWood git alt modüllerinin yazarlarının neden --inityeni alt modüller almak için gerekli olduğuna karar verdiklerine dair bir fikriniz var mı (otomatik olarak kapmak yerine update)? Görünüşe göre deponuzu güncellemek, verileri yok etmediği sürece gereken her şeyi almalı. Bununla birlikte --init, sizi yeni alt modüllerin yaratılmış olabileceğini bilmeye zorlar veya --inither seferinde her zaman bir sorun çıkarır , bu durumda yine, varsayılan olarak etkinleştirilmesi gerektiği anlaşılır.
Catskul

@Catskul Açıkçası git alt modüllerinin yazarlarının neden bir şeye karar verdiklerine dair hiçbir fikrim yok, ancak benim tahminim "güncelleme" nin zaten var olan bir şeyi güncellemek için ayrıldığı ve "init" in (yerel olarak) yeni bir şey yaratmak için kullanıldığı. Kaputun altında, ikisi muhtemelen farklı bir komuta izin verecek kadar önemli ölçüde farklı.
Carlo Wood

6

Aynı sorunu yaşadım ama yukarıdaki çözümlerden hiçbiri yardımcı olmadı. .Gitmodules ve .git / config içindeki girişler doğruydu ama komut git submodules update --init --recursivehiçbir şey yapmıyordu. Ayrıca alt modül dizinini kaldırdım ve çalıştırdım git submodules update --init --recursiveve alt modül dizinini geri aldım, ancak öncekiyle tamamen aynı commit ile.

Cevabı bu sayfada buldum . Komut şudur:git submodule update --remote


2
Bu aynı zamanda benim için doğru çözümdü. Onun git submodule updateyerine koşuyordum git submodule update --remote.
Andrew Medlin

5

Bir nevi sihirli bir şekilde, ama bugün koştum, git submodule initardından git submodule synctakip git submodule updateettim ve alt modüllerimi çekmeye başladı ... Büyü? Belki! Bu gerçekten Git ile ilgili en sinir bozucu deneyimlerden biri…

Kaşı onu. Aslında yaparak çalıştırdım git submodule update --init --recursive. Bu yardımcı olur umarım.

Not: Alt modülün değil, kök git dizininde olduğunuzdan emin olun.


7
Hayır, bu benim için kesinlikle hiçbir şey yapmaz.
IgorGanapolsky

@IgorGanapolsky Yukarıdaki cevabı benim için işe yarayanla düzenledim. Çalışırsa beni bilgilendir!
Levi Figueira

Yeni komutlarınızı denedim ama onlar da hiçbir şey yapmadı.
IgorGanapolsky

5

Manuel kurulumun .gitmodulesyeterli olduğunu düşünmek YANLIŞ

Benim yerel git version 2.22.0olarak bu yazının.

Bu yüzden neden git submodule initçalışmadığını merak ederek bu konuya geldim ; .gitmodulesDosyayı kurdum ve yapmaya başladım git submodule init...

ÖNEMLİ

  1. git submodule add company/project.git includes/projectolduğu gerekli , bu irade (ilk kez modülü eklerken):

    • yapılandırma ekle .git/config
    • .gitmodulesdosyayı güncelle
    • alt modül konumunu izleyin ( includes/projectbu örnekte).
  2. Eğer gerekir o zaman git commitsen submodule ekledikten sonra, bu taahhüt edecektir .gitmodulesve paletli alt modül konumu.

Proje tekrar klonlandığında, .gitmodulesalt modüller dizini boş olacaktır (örneğin includes/projectbu örnekte). Bu noktada , çalıştırılıncaya .git/configkadar alt modül yapılandırması yoktur git submodule initve bunun yalnızca çalıştığını unutmayın çünkü .gitmodulesAND includes/project, ana git deposunda izlenir.

Ayrıca referans için bakınız:



3

Ben de aynı sorunu yaşadım.

.gitmodules alt modül vardı, ancak bir git submodule init komuttan sonra içinde değildi.git/config .

Alt modülü ekleyen geliştiricinin, alt modül dizinini de .gitignoredosyaya eklediği ortaya çıktı . Bu işe yaramıyor.


2

Sizinle aynı şekilde git alt modül eşitlemesinin beklediğiniz şeyi yapmadığını gördüm. Sadece açık bir şekilde yaptıktan sonragit submodule add tekrar bir alt modül url'si değişir.

Ben de bu senaryoyu ~/bin/git-submodule-sync.rb :

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

Ayrıca, birkaç alım sonrası git dağıtım komut dosyalarında da aynı mantığı kullanıyorum.

Şimdi yapmam gereken tek şey düzenlemek .gitmodules, sonra bu komut dosyasını çalıştırmak ve sonunda düşündüğüm gibi çalışıyor git submodule sync.


Bu sadece bazı depolarda gerçekleşiyor gibi görünüyor ... muhtemelen Git'teki bazı hatalardan dolayı. Uzun süredir yeni oluşturulan depolarda başıma gelmedi , ama eskiden, belirli depolarda her zaman
oluyordu

2

Bugün de aynı sorunu yaşadım ve anladım ki git submodule init, o zaman yazdığım için şu satırlarımda vardı .git/config:

[submodule]
   active = .

Bunu kaldırdım ve yazdım:

git submodule update --init --remote

Ve her şey normale döndü, alt modülüm her zamanki gibi alt dizininde güncellendi.


2

Benim için sorun, deponun önceki geliştiricisinin submodules/thingklasörü sadece normal bir klasör olarak işlemiş olması , yani çalıştırmayı denediğimde git submodule add ...başarısız olması:'submodules/thing' already exists in the index ancak alt modülü güncellemeye çalışmak da başarısız olacaktı çünkü yolun olmadığını gördü bir alt modül içerir.

Düzeltmek için submodules/thingklasörü silmem, silme işlemini gerçekleştirmem ve ardından git submodule adddoğru şekilde geri eklemek için komutu çalıştırmam gerekiyordu:

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

1

Bunu bugün gördüğümde, bir geliştirici ağacın bir kısmını yeni bir alt dizine taşımıştı ve git istemcisi güncellenmiş Alt proje kurallarını ağaçta kaydetmemiş gibi görünüyor, bunun yerine sadece nükleer silah atıldı ve ayrıldı .gitmodules her ikisini de bayat olarak konumlar ve mevcut ağaçta artık var olmayan alt projelere.

Alt modüllerin tekrar eklenmesi ve gerekli sabit şeyleri ayarlamak için alt modülün commit shas'ını içinde bulunanlarla git show $breaking_commit_sha(regexp ile eşleşen satırları arama ^-Subproject) karşılaştırmak.


1

Daha önce varsa alt modül dizinini ve içeriğini ("external / pyfacebook" klasörü) silmek git submodule add ...sorunları çözebilir .


1
Benim için sorun buydu. Birisi "alt modül" klasörünü normal bir klasör olarak kaydetmişti, yani "git submodule add ..." komutunu çalıştırmaya çalıştığımda başarısız oluyordu: "'vendor / mobx-state-tree' dizinde zaten var" , yine de alt modülü güncellemeye çalışmak, yolun bir alt modül içermediğini gördüğü için de başarısız olacaktır). Düzeltmek için, klasörü silmem, silme işlemini gerçekleştirmem ve ardından doğru şekilde eklemek için git add komutunu çalıştırmam gerekiyordu.
Venryx

1

Bir alt modülde benzer bir sorun yaşadım. Sadece klonlanmak / çekilmek / güncellenmek / her neyse istemiyordu.

Kullanarak alt modülü yeniden eklemeye çalışırken git submodule add git@my-repo.git destinationaşağıdaki çıktıyı aldım:

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.git
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.

Bu yüzden add komutunu uygulamaya çalıştım :
git submodule add --force git@my-repo.git destination

Benim durumumda işe yaradı.


0

Kayıt için:
Aynı sorunu alt modül olarak boş bir depo ekleyerek oluşturdum . Bu durumda, alt modül için kullanılabilir bir referans karması yoktu ve bu da orijinal gönderen tarafından açıklanan hataya neden oldu.

Sorunu çözdükten sonra depoyu zorunlu olarak eklemek sorunu çözdü (Arvids gönderisinde olduğu gibi)
git submodule add --force git@my-repo.git destination


0
  • Alt modülü cihazınızdan çıkarın .git/config
  • git submodule initKomut çalıştır
  • Alt modül dizininize gidin ve çalıştırın git pull origin master

Şimdi çalışmalı


0

Sadece benim için işe yarayan şeyi paylaşıyorum:

git clone --recurse-submodules <repository path>

Bu, alt modülleri zaten içeren uzak depoyu klonlar. Bu, klonlamadan sonra git alt modül güncellemesini veya init'i çalıştırmanız gerekmeyeceği anlamına gelir.


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.