Soru Bir alt modemi nasıl kaldırabilirim?


Git alt modülünü nasıl kaldırırım?

Bu arada, yapamayacağım bir sebep var mı

git submodule rm whatever

?


3024
2017-08-11 14:31


Menşei


Basit cevap stackoverflow.com/a/21211232/94687 şimdi doğru olanı ve işaretlenmelidir. Şimdi, sadece git rm modulename ve rm -rf .git/modules/modulename - imz -- Ivan Zakharyaschev
Bu aslında doğru değil. Bu cevap, alt modül girişini kaldırmaya yönelik değil. .git/config. Kabul edilen cevap, bir alt modülü tamamen kaldırmanın güncel yolunu gösterir. Ayrıca bu cevapta daha açık bir şekilde açıklanmıştır: stackoverflow.com/a/36593218/1562138 - fvgs
Bu makaleyi alt modülleri kaldırırken çok yardımcı buldum. .Gitsubmodules ve .git / config dosyalarındaki girişleri kaldırma hakkında bilgi içerir. bağlantı - Ri_
Lütfen kendinizi biraz zamandan tasarruf edin ve doğrudan işe yarayan cevaba gidin (2017'de): stackoverflow.com/a/36593218/528313 - Vincenzo Pii
İki gün boyunca alt modül problemlerini çözdüm. Bu buluşu bulduğumda ortaya çıktı: forums.developer.apple.com/thread/13102. Temel olarak, Xcode ve belki de diğer uygulamalar, '' içeren URL'leri genişletmek için mücadele eder. Bir kez ssh: //username@server.remoteHost.com/~/git/MyRepo.git 'i ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git olarak değiştirdim (asıl yolu arayın sunucunuzda, tüm tuhaflıklar on dakika ile ortadan kayboldu. Ayrıca bakınız stackoverflow.com/questions/32833100/... - Elise van Looij


Cevaplar:


Dan beri git1.8.3 (22 Nisan 2013):

"Bir altmodüle olan ilginizi ifade ettikten sonra," bu alt modülle artık ilgilenmiyorum "demek için hiçbir Porselen yol yoktu.submodule init".
  "submodule deinit"bunu yapmanın yolu.

Silme işlemi de kullanır git rm (beri1.8.5 Ekim 2013).

özet

3 aşamalı kaldırma işlemi şu şekilde olur:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

açıklama

rm -rf: Bu bahsedilir Daniel Schroeder'ler Cevapve tarafından özetlenmiştir Eonil içinde yorumlar:

Bu yapraklar .git/modules/<path-to-submodule>/ değişmeden.
  Bu yöntemi kullanarak bir alt modülü bir kez sildiyseniz ve yeniden yeniden eklerseniz, depo zaten bozuk olduğundan, bu mümkün olmayacaktır.


git rm: Görmek işlemek 95c16418:

Şu anda "kullanıyorgit rm"bir alt modüldeki alt modülün çalışma ağacını, süper projeden ve dizinden gelen dizinden çıkarır.
  Ama alt modülün bölümü .gitmodules dokunulmamış bırakılır, bu artık kaldırılan alt modülün bir parçası ve kullanıcıları tahriş edebilir. .git/configBu, kullanıcının bu alt modüle ilgi gösterdiğini hatırlatmak için kalmalıdır, bu nedenle daha eski bir işlem teslim edildiğinde yeniden doldurulacaktır).

Bırak "git rm"Kullanıcıya sadece alt ağacı çalışma ağacından kaldırmaya değil, aynı zamanda"submodule.<submodule name>"bölümünden .gitmodules hem dosya hem de sahne.


git submodule deinit: Kaynaklanıyor bu yama:

İle "git submodule init"Kullanıcı bir ya da daha fazla alt-diziyi önemsediğini ve bir sonraki çağrıda yer almasını istediğini söyleyebildi"git submodule update".
  Fakat şu anda, artık bir alt-modülü umursamadıkları ve yerel çalışma ağacından kurtulmak istedikleri (kullanıcı altmodül internals hakkında çok fazla bilgi sahibi olmadıkça ve "submodule.$name.url"ayarı .git/config iş ağacının kendisi ile birlikte).

Bu kullanıcılara bir 'deinit'komut.
  Bu tüm kaldırır submodule.<name> bölümünden .git/config verilen için   alt modülü (lar) (ya da eğer başlatılmış olanlar için).' verilmiş).
  Geçerli çalışma ağacında, zorlanmadıkça değişiklikler varsa başarısız.
  Komut satırında verilen bir alt modüle ne zaman başvurulursa, URL ayarının bulunamaması .git/configama yine de başarısız olmuyor.

Bu (de) başlatma adımları (.git/config ve .git/modules/xxx)

Git1.8.5'ten beri git rm alır Ayrıca bakımı:

  • 'add'bir alt modulün url'sini kaydeden adım .gitmodules dosya: sizin için kaldırılması gerekiyor.
  • alt modül özel giriş (tarafından gösterildiği gibi bu soru): git rm dizinden kaldırır:
    git rm --cached path_to_submodule(iz yok)
    Bu dizini, bir alt modul kök dizini olarak işaretleyerek özel bir mod "160000" ile dizinde kaldıracaktır.

Son adımı unutursanız ve bir alt dizinin normal bir dizin olduğunu eklemeyi denerseniz, aşağıdaki gibi bir hata iletisi alırsınız:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Not: Git 2.17'den (Q2 2018) beri, git submodule deinit artık bir kabuk komut dosyası değildir.
Bir C fonksiyonuna bir çağrıdır.

Görmek taahhüt et 2e61273, 1342476 işlemek (14 Oca 2018) tarafından Prathamesh Chavan (pratham-pc).
(Birleştirilmiş Junio ​​C Hamano - gitster - içinde ead8dbe işlemek, 13 Şub 2018) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1799
2018-04-23 05:57



İçin kullanım örneği verilebilir mi submodule deinit? - zakdances
@yourfriendzak burada başarıyla kullanan birinin örneğidir: stackoverflow.com/a/16161950/6309. Ama unutmayın ki, orijinal olarak inandığımın aksine, 1.8.3 henüz çıkmadı! Unix'te, onu kaynaklardan derleyebilirsiniz. - VonC
@HamishDowner özel giriş gitmiş olmalı (dizin artık bir alt modüldür) ve .gitmodules Tamam, ama ben hala bir şey ile iki kez kontrol olurdu .git dizin (örneğin yerel yerel repo dahilinde yapılandırma: git pull) - VonC
@Jayen evet, eğer .gitmodules giriş ve indekste özel girişin kaldırılması ve bu repo itme, diğerleri çekebilir ve bu alt modülün gitmiş olacak. - VonC
İşte bu adımları otomatik hale getiren bir komut dosyası: gist.github.com/sharplet/6289697. Onu ekle PATH ve git remove-submodule path/to/submodule. - Adam Sharp


Sayfa üzerinden Git Submodule Eğitimi:

Bir alt modülü kaldırmak için yapmanız gerekenler:

  1. İlgili bölümü silin .gitmodules dosya.
  2. Sahne Alanı .gitmodules değişiklikler git add .gitmodules
  3. İlgili bölümü silin .git/config.
  4. Koşmak git rm --cached path_to_submodule (iz yok eğik çizgi).
  5. Koşmak rm -rf .git/modules/path_to_submodule
  6. işlemek git commit -m "Removed submodule <name>"
  7. Şimdi izlenmeyen alt modül dosyalarını silin
    rm -rf path_to_submodule

Ayrıca bakınız: aşağıdaki alternatif adımlar.


3145
2018-01-18 23:30



"Ve bu arada, sadece benim altmodule rm gidemem için bir neden var mı?" ? - abernier
@abernier Bir kedinin cevabı, "böyle bir komut bulunmadığı için" olabilir. Benim tahminim onlar yanlışlıkla veri kaybı önlemek için submodule yapılandırma açık submodule dosyaları kaldırmaya çalışıyorum. Belki bir kişi bunu düşünür git submodule rm basitçe submodule kaydını kaldırır ve komut yerel depoyu da sildiyse şaşırır. Herhangi bir yerel değişiklik geri dönüşü olmayan bir şekilde kaybedilecektir. Ve belki başka bir kişi sadece dosyaların kaldırılacağını düşünürdü. - John Douthat
Açıkçası nedenini bilmiyorum. Umarım bir komut eklerler. Bu 4 adım çok karmaşık. - John Douthat
Burada bir altmodülü kaldıran bir betik betiği, sadece submodule-rm için bir hedef takma adı oluşturmak;) gist.github.com/2491147 - Capi Etheriel
ayrıca rm -rf .git \ modules \ submodule ismine mi ihtiyacınız var? - rogerdpack


Sadece bir not. Git 1.8.5.2'den beri, iki komut şunları yapacak:

git rm the_submodule
rm -rf .git/modules/the_submodule

@Mark Cheverton'un yanıtının doğru bir şekilde işaret ettiği gibi, ikinci satırın kullanılmaması durumunda, şu an için alt modülü kaldırmış olsanız bile, kalan .git / modules / the_submodule klasörü, aynı alt-modemin gelecekte eklenmesini veya değiştirilmesini engelleyecektir. . Ayrıca, VonC'nin de belirttiği gibi, git rm işin çoğunu bir alt modüldeki yapacak.

- Güncelleme (07/05/2017) -

Sadece netleştirmek için, the_submodule Projenin içindeki alt modülün göreli yolu. Örneğin, subdir/my_submodule Alt modül bir alt dizinin içinde ise subdir.

Yorumlarda doğru olarak işaret edildiği gibi diğer cevaplar, iki komut (bir alt modülü kaldırmak için işlevsel olarak yeterli olsa da), bir iz bırakmayın [submodule "the_submodule"] bölümü .git/config (Temmuz 2017 itibariyle), üçüncü bir komut kullanılarak kaldırılabilir:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

332
2018-04-13 08:51



Ben git sürüm 2.4.9 (Apple Git-60) kulüpler ve tüm yapmak zorunda rm the_submodule oldu. Daha sonra alt modülle aynı adlı bir klasörü yeniden ekledim ve sorunsuz çalıştı. - David Silva Smith
Bu alt modülden girişi kaldırmaz. .git/config. Görmek stackoverflow.com/a/36593218/1562138 Bir alt modülü kaldırmak için tam yol. - fvgs
Bu% 100 kesinlikle mükemmel ve çalışır. Vay. - Dan Rosenstark
@drevicko Bunu sadece Git 2.11.1 ile test ettim ve daha önce olduğu gibi aynı davranışı gözlemliyorum. git init && git submodule add <repository> && git rm <name> arkasında bırakır .git/config giriş ve .git/modules/<name> dizin ve içeriği. Belki de alt modülü kaldırmadan önce başlatmadınız mı? - fvgs
İlk önce bunu daha güvenli hissediyorum ... git submodule deinit -f the_submodule - danday74


Bu soruya verilen cevapların çoğu güncel olmayan, eksik veya gereksiz bir şekilde karmaşıktır.

Git 1.7.8 veya daha yeni bir sürümü kullanarak klonlanan bir alt modül, yerel repo'unuzda en fazla dört iz bırakacaktır. Bu dört izi kaldırmak için işlem aşağıdaki üç komutla verilir:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

246
2018-03-02 16:07



Bu cevabın neden bu kadar az açıklaması var? Tüm bu popüler cevaplar bir şeyi özlüyor, bu bir altmodülün tüm izlerini gerçekten mümkün olan en basit şekilde kaldıran tek şey. Ve not: komutların sırası önemlidir. - mbdevpl
Kendi soruma cevap vermek için: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows - Thomas
@mbdevpl kabul edilen cevaptan 3 yıl sonra geldi ve sanırım hiç kimse bunu kabul etmek için OP'yi ikna etmeyi başaramadı. - Andy
@Thomas rm -rf sadece "tüm klasörü sil" anlamına gelir, böylece Windows'da Explorer GUI'den bunu yapabilirsiniz. Alternatif olarak, Windows'ta git kullanıyorsanız, git bash'ın da mevcut olması gerekir, böylece tüm bu komutları orada çalıştırabilirsiniz ve oldukları gibi çalışırlar - Andy Madge
Bu 2018'de karmaşık bir cevap değil mi? - Warren P


Basit adımlar

  1. Yapılandırma girişlerini kaldır:
    git config -f .git/config --remove-section submodule.$submodulename
      git config -f .gitmodules --remove-section submodule.$submodulename
  2. Dizini dizinden kaldır:
    git rm --cached $submodulepath
  3. işlemek
  4. Kullanılmayan dosyaları sil:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Lütfen aklınızda bulundurun:  $submodulepath lider veya sondaki eğik çizgi içermiyor.

Arka fon

Ne zaman yaparsın git submodule add, sadece onu ekler .gitmodules, fakat bir kez yaptın git submodule init, ekledi .git/config.

Bu yüzden, eğer modülleri çıkarmak isterseniz, ancak hızlı bir şekilde geri yükleyebilmek istiyorsanız, o zaman sadece şunu yap:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Yapmak iyi bir fikir git rebase HEAD ilk ve git commit sonunda, bunu bir senaryoya koyarsanız.

Ayrıca bir göz atın bir cevap Bir Git alt modülünü beğenmeme miyim?.


185
2017-08-11 14:43



Çok fazla alt modüllerim vardı (ve daha büyük bir karışıklık) bu yüzden onları bir döngüden geçirmem gerekti. Belirli bir dizinin ve ls çıktısının çoğunun takip eden eğik çizgi içermesi nedeniyle. Ben gibi bir şey yaptım for dir in directory/*; do git rm --cached $dir; done. - Pablo Olmos de Aguilera C.
Yinelemeli silme için senaryoda kullanılabilen listeyi almak için - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - - Eğer böyle bir şey varsa, bunu yapmak zorunda gibi görünüyor, aksi takdirde sadece git submodule | grep -v '^+' | cut -d' ' -f3 - errordeveloper
Yerel değişiklik yapılmayan modüllerin listesini almak için - git submodule | grep '^+' | cut -d' ' -f2 - errordeveloper
not eklemek zorundaydım submodulename çift ​​tırnak içinde "submodulename" .. .git/config dosya - muon
# 2 tam olarak aradığım şeydi, teşekkürler! +1 - AyexeM


Önerilere ek olarak, ben de vardı rm -Rf .git/modules/path/to/submodule Aynı isimle yeni bir alt modül ekleyebilmek (benim durumumda orijinal ile bir çatal değiştirdim)


80
2017-10-12 10:17



Bununla da sıkıntı yaşıyordum. Bir alt modemi aynı yola yeniden yüklemeye çalışırsanız, şube bilgilerinin önbelleğe alındığı yerdeki önbelleğe alınmış bilgileri saklar. - jangosteve
Teşekkürler, buna da ihtiyacım vardı. @Anton, Katılıyorum ve bu bilgiyi eklemek için topvotlu cevabı düzenledim. - William Denniss
Değiştirme işini yapmak için --name seçeneğini kullandım ... stackoverflow.com/questions/14404704/... - joseph.hainline


Girişi kaldırmalısınız .gitmodules ve .git/configve modülün dizinini geçmişten kaldırın:

git rm --cached path/to/submodule

Git'in posta listesine yazacak olursanız, muhtemelen birisi sizin için bir kabuk komut dosyası hazırlayacaktır.


46
2017-11-01 21:43



Herhangi bir kabuk betiğine gerek yoktur, diğer cevabın bir alt modemin tüm izlerini kaldırmak için komutları vardır: stackoverflow.com/a/36593218/4973698 - mbdevpl


Eklenen bir alt modülü kaldırmak için:

git submodule add blah@blah.com:repos/blah.git lib/blah

Koşmak:

git rm lib/blah

Bu kadar.

Git (circa ~ 1.8.5) 'in eski versiyonları için:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

45
2017-07-09 17:55



+1 gerçekten. Git 1.8.3'ten itibaren doğru cevap budur. Doğru olan kabul edilmelidir. - Xananax
+1 Git'in daha yeni sürümlerinde kaldırmanın düzgün ve temiz yolu. - Xiv
git rm hala içinde şeyler bırakır .git/modules/. (2.5.4) - Rudolf Adamkovič
@RudolfAdamkovic benim için çalışıyor? Tam yol eşleştiğinde yalnızca alt modüldeki girişi kaldırdığına dikkat edin; Bir alt modüle geçtiyseniz ve ardından git rm değil; Benim mac üzerinde 2.5.4 ile hızlı bir test, burada belgelerinde açıklandığı gibi .gitmodules dosyasını güncelleştirir: git-scm.com/docs/git-rm#_submodules ... ama bunun gerçekleşmediği bir platform / sürüm kombinasyonu bulmuş olsaydınız, muhtemelen bu konuda bir hata yapmalısınız. - Doug
Bu cevap tamamen doğru değil. git rm şeyler bırakır .git/modules/ dir ve .git/config dosya (ubuntu, git 2.7.4). Diğer cevaplar% 100 çalışır: stackoverflow.com/a/36593218/4973698 - mbdevpl


Başkaları tarafından sağlanan çözümleri otomatikleştirmek için bir takma ad kullanabilirsiniz:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

Bunu git yapılandırmanıza koyun ve sonra şunları yapabilirsiniz: git rms path/to/submodule


40
2018-05-16 09:27





Özetlemek gerekirse, yapman gereken şey bu:

  1. Set path_to_submodule var (iz yok):

    path_to_submodule=path/to/submodule

  2. İlgili satırı .gitmodules dosyasından silin:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. İlgili bölümü .git / config dizininden silin

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. Unstage ve $ path_to_submodule 'i sadece dizinden (bilgiyi kaybetmemek için) kaldırın.

    git rm --cached $path_to_submodule

  5. .Gitmodules için yapılan değişiklikleri izleyin

    git add .gitmodules

  6. Süper projeyi tamamlayın

    git commit -m "Remove submodule submodule_name"

  7. Şimdi izlenmeyen alt modül dosyalarını silin

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


38
2017-10-22 10:54



Bu yüzden benim değişiklikimi aşağı çeken herkes alt modüle önbellek kaldırmak için rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule çalıştırmak zorunda kalacak? - j2emanue
Güncellemeyi öneririm git submodule update. Altmodüller yolları doğru şekilde güncellenmemişse (git bir hata atar), bunları kaldırın: rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update - luissquall


Alt modül kazara Eklediniz, eklediniz ve zaten bir Git deposu olan bir klasöre ittiniz. .git), bir .gitmodules düzenlemek için dosya veya herhangi bir şey .git/config. Bu durumda tek ihtiyacınız olan şudur:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIWBen de kaldırdım .git yapmadan önce klasör git add.


35
2017-12-18 22:50



tam olarak benim durumum - zhekaus