Git alt modülünü yeniden adlandırma


156

Git alt modül dizinini yeniden adlandırmanın kolay bir yolu var mı (tüm silme hareketinden geçmek ve yeni bir hedef adıyla yeniden eklemek dışında).

Ve biz varken, neden sadece üst dizinde aşağıdakileri yapamıyorum: git mv old-submodule-name new-submodule-name


6
.gitmodulesBir alt modülü taşırken artık manuel olarak güncellemenize gerek kalmayacak . bkz aşağıda Cevabımı
VonC


Git modülleri çok karmaşık. npmnasıl basit çalıştığını gösterir. Bir gün ... belki ... birisi ... yeniden yazacak ... bu arada ...
Rolf

@ VonC'nin cevabı bugün itibariyle tam bir hikaye değil: gerçekten .gitmodules değişecek, ancak modül adını değil, yolu yeniden adlandıracak. Bunu düzeltmek için .gitmodules için ek bir düzenlemeye ve tüm işlemi tamamlamak için bir 'git submodule
sync'e ihtiyacınız var

@zertyz: [submodule "name_of_submodule"] özelliği Git dahili adıdır, kendinizi karıştırmamak için yeniden adlandırabilirsiniz ancak bu yalnızca bir etikettir.
MKesper

Yanıtlar:


101

Aşağıdaki iş akışı çalışma bulundu:

  • Güncelleme .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Not: Bu yaklaşım, GIT'in 2018 sürümlerinde dizini ve .gitmodülleri düzgün şekilde güncellemez.

Not: Artık tıpkı yapmak mümkün olabilir git mv oldpath newpathde sivri out gibi, şimdi VonC 'ın cevabı . (Git'in en son sürümünü kullandığınızdan emin olun)


22
kendini not: için git add newpathbir eğik çizgi kullanmayın
atomicules

10
Böyle bir iş akışı ile, yalnızca alt modül olarak kullandığınız alt dizine bir sembolik bağlantı oluşturursunuz. Symlink, global alt modül işlevselliğinin sadece bir parçasıdır. Bu, yeniden adlandırılmış alt modülleri kullanan repo'yu klonladığınızda , aşağıdaki hatayla sonuçlanabileceğiniz anlamına gelir: .gitmodules içinde 'your-oldpath' yolu için alt modül eşlemesi bulunamadı (* git rm oldpath ) git alt modülünü kullan "git add newpath * yerine REPO-URL newpath ekle. Bittiğinde git durumu şöyle bir şey görüntüler: renamed: oldpath -> newpath
Bertrand

5
Git add komutunu kullanırken, alt modül projeye alt modül olarak değil, basit bir dizin olarak dahil edildiğinden bu çözümler benim için çalışmaz. $ mv submodule-oldpath ~ / another-location $ git rm submodule-oldpath $ git submodule add submodule-repository-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmud Adam

3
Çalışma ağacıyla ilgili sorun yaşıyorsanız, .git/modules/SUBMODULE/configdosyayı worktreedoğru dizine yeniden işaret edecek şekilde de düzenleyebilirsiniz .
Vincent Ketelaars

3
Bu git ile benim için işe yaramadı 2.13.1. Ama sadece git mv old newbir cazibe gibi çalışır. Sadece değişiklikleri tamamlamak için git taahhüdünü yapmam gerekiyor.
kullanıcı

226

Git1.8.5 (Ekim 2013) süreci basitleştirmelidir . Basitçe:

git mv A B

" git mv A B", bir alt modülü hareket ettirirken , çalışma ağacının yerini değiştirmeyi ve dosyadaki yolları ayarlamayıA öğretmiştir ..gitmodules


Daha fazla bilgi için taahhüt 0656781fadca1 :

Şu anda git mvbir alt modülde " " kullanılması , alt modülün çalışma ağacını süper projeninkine taşır. Ancak alt modülün yol ayarına .gitmodulesdokunulmadan bırakılır, bu da artık çalışma ağacıyla tutarsızdır ve uygun path -> name mapping(gibi statusve diff) garip davranan git komutlarını yapar .

" git mv" Alt modülün çalışma ağacını hareket ettirmekle kalmayıp aynı zamanda dosyadan " submodule.<submodule name>.path" ayarını güncelleyerek .gitmodulesve her ikisini de aşamalandırarak burada " " yardım edelim .
Bu, hiçbir .gitmodulesdosya bulunamadığında gerçekleşmez ve yalnızca bu alt modül için bir bölümü olmadığında uyarı verir. Bunun nedeni, kullanıcının .gitmodules"git mv" komutunu vermeden önce düz gitlinks'i dosya olmadan kullanması veya yol ayarını el ile güncellemesidir (bu durumda uyarı, mvbunu kendisi için yapması gerektiğini hatırlatır ).
Yalnızca .gitmodulesbirleştirme çakışmaları bulunduğunda ve içerdiğinde mvkomut başarısız olur ve kullanıcıya yeniden denemeden önce çakışmayı çözmesini söyler.


git 2.9 (Haziran 2016) git mvalt modül için gelişecek :

Bkz. A127331 (19 Nis 2016), Stefan Beller ( stefanbeller) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 9cb50a3 tamamlama 2016, 29 May)

mv: yuvalanmış alt modüllerin hareket etmesine izin ver

" git mv old new", dizinin içinde bir alt old/dizin olarak yaşayan bir alt modülün yolunu doğru ayarlamamış.

ancak alt modüllerin git dizinine olan bağlantılarını ve .gitmodulesdosyadaki güncellemeleri güncellemeleri gerekir .


Kendime not: 1.8.4'te deneyin ve sahip olacaksınız fatal: source directory is empty, source=my_source, destination=my_destination. 1.8.5 kararlı bir sürümü olduğunda bunu tekrar deneyeceğim.
checksum

@checksum Ama 1.8.5, en az birkaç saat boyunca kararlı bir sürüme sahiptir;) github.com/git/git/releases/tag/v1.8.5
VonC

Ubuntu depolarında Git v.1.7.5 olduğu için kaynak kodundan Git 1.8.5.GIT sürümünü oluşturmak zorunda kaldım. Git'i kaynak koddan nasıl oluşturabilirim
Maksim Dmitriev

2
@MaksimDmitriev ama stackoverflow.com/a/20918469/6309'da bahsettiğim bir ppa (Kişisel Paket Arşivi) ne olacak ?
VonC

2
git mv makinemde bu amaç için çalışmıyor.
Alexander Dyagilev


11

Yukarıda önerilenlerden birkaçını denedim. Koşuyorum:

$ git --version
git version 1.8.4

Alt modülün başlangıcını kaldırmak, dizini kaldırmak ve yeni bir alt modül oluşturmak en iyisidir.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

En azından benim için en iyi olan buydu. YMMV!


7

deinitYeniden adlandırmak mümkün değildir, bu yüzden önce ( ) kaldırmanız ve tekrar eklemeniz gerekir.

Yani kaldırdıktan sonra:

git submodule deinit <path>
git rm --cached <path>

ayrıca referansları tekrar kontrol edip kaldırabilirsiniz:

  • .gitmodules
  • .git/config
  • .git/modules/<name>her klasör, configreferansı koruduğu bir dosyaya sahip olduğundan referans klasörünü kaldır (bir yedekleme yapmak için en iyisi)worktree

daha sonra repo üzerinde herhangi bir değişiklik yaparak değişikliklerinizi aşamalı olarak gerçekleştirin:

git commit -am 'Removing submodule.'

ve göze çarpan sorunlarınız olup olmadığını iki kez kontrol edin:

git submodule update
git submodule sync
git submodule status

şimdi git alt modülünü tekrar ekleyebilirsiniz:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

ayrıca bugün
Alexey

Sorular başlığı yanlış bir isim, isim değil yolla ilgilidir
Max Robbertze

3

Alt modülü yeniden adlandırmak için .gitmodules dosyasını düzenleyin ve sonra alt modül dizinini yeniden adlandırın.

Sanırım git submodule syncdaha sonra yapmanız gerekebilir , ama şu anda kontrol etme pozisyonunda değilim.


Bu, yeni alt modül adının yeniden adlandırma olarak değil, yeni bir taahhüt olarak görünmesine neden olur. Ama belki de böyle olması gerekir mi?
Lars Tackmann

1
@Lars: Eski alt modül dizinini de kaldırdığınızdan emin olun!
Cascabel

3

MacOs : Alt modül klasörünü Commonküçük harfe değiştirmek için VonC çözümünü kullanmak istediğimde :

git mv Common common

alırım

fatal: 'Ortak' olarak yeniden adlandırma başarısız oldu: Geçersiz bağımsız değişken

Çözüm - geçici bir klasör adı kullanın ve iki kez taşıyın:

git mv Common commontemp
git mv commontemp common

Bu kadar :)

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.