git alt modülü üretime aktarılmadı
İki alt modüle sahip yeni bir depo oluşturdunuz. Yerelde iyi çalışıyor, ancak üretime geçerken alt modüller orada değil. Her bir alt modül kök dizini mevcut, ancak içinde dosya yok
git version 2.27.0
Üretimde repo oluştur
git --bare init
cd hooks && touch post-receive && chmod +x post-receive
cat hooks/post-receive
#/bin/sh
git --work-tree=/var/www/repo --git-dir=/var/git_repos/repo.git checkout -f
Geliştiriciden / yerelden üretime aktarılıyor
git push production master
git statusher şeyin güncel olduğunu söyler. Alt modül klasöründe çağrılsa bile. Yerel depodaki alt modül klasörünü silmeyi denediniz, depoya kaydetme / gönderme. Ardından git push production master, üretim sunucusundaki kök alt modül klasörü silindi. Sonra tekrar eklemeye çalışıyorum
# git submodule add [email protected]:alias/repo_name.git php/repo/repo_name
Cloning into '/var/www/project/php/repo/repo_name'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 19 (delta 8), reused 19 (delta 8), pack-reused 0
Receiving objects: 100% (19/19), 8.62 KiB | 8.62 MiB/s, done.
Resolving deltas: 100% (8/8), done.
Sonra depoya aktarılıyor ve sonra git push production master. Aynı problem. Üretimde alt modüllerin kök klasörleri bulunur, ancak dizinlerde dosya yoktur.
Depoya github'da göz attığımda, alt modüller doğru şekilde bağlanıyor.
Her şey yerel depoda çalışıyor
Yanıtlar
Alt modül klasörleri github'da (veya yerel depoda) boş değildir, ancak üretime gönderilirken
Beklenen: bir alt modül şunlardan oluşur:
- içinde kayıtlı bir URL
.gitmodules - a gitlink, alt modül havuzunun kök ağacının SHA1'ini temsil eden dizindeki özel bir giriş.
git clone --recurse-submodulesAlt modülleri olan bir uzak depoyu klonladığınızda ( seçeneği kullanarak , bu alt modül depoları kendileri klonlanır ve bu gitlink tarafından temsil edilen SHA1'de kullanıma alınır.
"Üretime itmek" aldatıcıdır çünkü kullanıma alınmış (çıplak olmayan) bir depoya itmemeniz gerekir ( teknik olarak yapsanız bile ).
Dosyaları geri yüklemek için bir alma sonrası kancası kullanacak olan üretimde çıplak bir depoya itmek daha iyidir (alt modül içerikleri dahil, kullanarak git restore --recurse-submodules)
Tartışmadan sonra :
Alt modüller
.gitmodulesbir SSH URL ile kaydedildiğinden, üretim sunucusunun hesabınıza kayıtlı bir genel SSH anahtarına sahip olması gerekir .Alma sonrası komut dosyası şu hale gelir:
#!/bin/bash cd /var/www/repo git --git-dir=/var/git_repos/repo.git --work-tree=. restore --recurse-submodules :/
İle git submodule, çalışma ağacını görünüşte ayarlayamazsınız
Bu, alt modüller dahilse, geçerli klasörünüzün çalışma ağacı olması gerektiği anlamına gelir.
Daha sonragit checkout / git restorewith gibi komutlar --recurse-submodulesveya git submodule update --initfarklı bir git-dir ( --git-dir=/path/to/bare/repo.git) ile bile yapabilirsiniz .
Mevcut çalışma ağacınız doğru olduğu için alt modüller güncellenecektir.
Belirtmiş olsanız /var/www/repobile herhangi bir yerdeyseniz git --work-tree=/var/www/repo ..., yukarıda belirtilen komutların hiçbiri git checkout/ git restoreile --recurse-submodulesveya git submodule update --initdeponuzun alt modülleri için çalışmayacaktır.
Yani: /var/www/repoDosyalarınız geri yüklenecek, ancak alt modüller boş kalacaktır.