Saya ingin mengubah nama direktori dari sebuah submodule Git di proyek super Git saya.
Mari kita anggap saya memiliki entri berikut di .gitmodules
file saya :
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
Apa yang harus saya ketik untuk memindahkan .emacs.d/vimpulse
direktori .emacs.d/vendor/vimpulse
tanpa menghapusnya terlebih dahulu (dijelaskan di
sini dan di sini ) dan kemudian menambahkannya kembali.
Apakah Git benar-benar membutuhkan seluruh path dalam tag submodule
[submodule ".emacs.d/vimpulse"]
atau mungkinkah hanya menyimpan nama proyek?
[submodule "vimpulse"]
git
git-submodules
inich
sumber
sumber
git mv
perintah, tepat di pertanyaan.git mv
seperti ini. Gunakandeinit
kemudianrm
seperti yang ditentukan stackoverflow.com/a/18892438/8047 .git mv
hanya berfungsi untuk submodules juga, tidak perlu untuk yang lain.1.8.5
submodula yang bergerak didukung secara native menggunakangit mv
perintah ( dari catatan rilis , pertama kali ditautkan oleh @thisch sendiri). Juga dijawab di sinigit mv
tidak memindahkan submodule di ruang kerja, dan memperbarui file .git submodule dengan benar, tetapi subfolder di dalam folder .git / modules dari repo induk tetap sama - apakah itu oke? (Saya menggunakan git 2.19.0 di Windows)Jawaban:
Catatan: Seperti disebutkan dalam komentar, jawaban ini merujuk pada langkah-langkah yang diperlukan dengan versi git yang lebih lama. Git sekarang memiliki dukungan asli untuk memindahkan submodula:
Prosesnya mirip dengan cara Anda menghapus submodule (lihat Bagaimana cara menghapus submodule? ):
.gitmodules
dan ubah jalur submodule dengan tepat, dan masukkan ke dalam indeks bersamagit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
dengan semua kontennya ke.git/modules/new/parent/submodule
..git/modules/new/parent/config
file tersebut, pastikan item butir kerja menunjuk ke lokasi baru, jadi dalam contoh ini seharusnyaworktree = ../../../../../new/parent/module
. Biasanya harus ada dua lebih..
dari direktori di jalur langsung di tempat itu.Edit file
new/parent/module/.git
, pastikan path di dalamnya menunjuk ke lokasi baru yang benar di dalam.git
folder proyek utama , jadi dalam contoh inigitdir: ../../../.git/modules/new/parent/submodule
.git status
output terlihat seperti ini untuk saya setelahnya:Akhirnya, lakukan perubahan.
sumber
path
konfigurasi itu dan nama submodule itu. Misalnya, dalam bergerak foo / modul untuk bar / modul Anda harus mengubah di .gitmodules bagian[submodule "foo/module"]
untuk[submodule "bar/module"]
, dan di bawah yang bagian yang samapath = foo/module
untukpath = bar/module
. Juga, Anda harus mengubah .git / config bagian[submodule "foo/module"]
ke[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
menghapus saja file .git atau direktori dalam submodule..git/modules/old/parent/submodule
, pindah ke lokasi baru, memperbaruigitdir
diold/parent/submodule/.git
...git mv old/submod new/submod
bekerja seperti yang diharapkan dan melakukan semua pipa ledeng untuk Anda. Anda mungkin ingin menggunakan git 1.9.3+ karena menyertakan perbaikan untuk pemindahan submodule.Jawaban paling modern, diambil dari komentar Valloric di atas:
git mv old/submod new/submod
git status
.)git commit
dan Anda baik untuk pergi!Selesai!
sumber
1.9.3
kecuali untuk submodule di dalam submodule yang dipindahkan. Itu membutuhkan beberapa pembersihan manual.1.8.5
seperti yang dijelaskan dalam catatan rilis ..gitmodules
file,old/submod
masih digunakan sebagai label untuk submodule sementara path telah diubah. Untuk mengubah label juga, tampaknya Anda harus benar-benar memindahkan jalur direktori modul ke dalam.git
, dan kemudian secara manual mengubah label.gitmodules
.Dalam kasus saya, saya ingin memindahkan submodule dari satu direktori ke subdirektori, misalnya "AFNetworking" -> "ext / AFNetworking". Ini adalah langkah-langkah yang saya ikuti:
[core] worktree
jalurnya. Milik saya berubah dari../../../AFNetworking
menjadi../../../../ext/AFNetworking
gitdir
. Milik saya berubah dari../.git/modules/AFNetworking
menjadi../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Akhirnya, saya melihat dalam status git:
Et voila. Contoh di atas tidak mengubah kedalaman direktori, yang membuat perbedaan besar pada kompleksitas tugas, dan tidak mengubah nama submodule (yang mungkin tidak benar-benar diperlukan, tapi saya melakukannya agar konsisten dengan apa akan terjadi jika saya menambahkan modul baru di jalur itu.)
sumber
[Pembaruan: 2014-11-26] Saat Yar merangkum dengan baik di bawah ini, sebelum Anda melakukan apa pun, pastikan Anda tahu URL dari submodule. Jika tidak diketahui, buka
.git/.gitmodules
dan periksa kuncinyasubmodule.<name>.url
.Yang berhasil bagi saya adalah menghapus submodule lama menggunakan
git submodule deinit <submodule>
diikuti olehgit rm <submodule-folder>
. Kemudian tambahkan submodule lagi dengan nama folder baru dan komit. Memeriksa status git sebelum melakukan menunjukkan submodule lama diubah namanya menjadi nama baru dan .gitmodule dimodifikasi.sumber
Triknya tampaknya memahami bahwa
.git
direktori untuk submodula sekarang disimpan di repositori master, di bawah.git/modules
, dan setiap submodule memiliki.git
file yang mengarah ke sana. Ini adalah prosedur yang Anda butuhkan sekarang:.git
file dalam direktori kerja submodule, dan modifikasi path yang dikandungnya sehingga menunjuk ke direktori yang benar di direktori master repositori.git/modules
..git/modules
direktori master repositori , dan temukan direktori yang sesuai dengan submodule Anda.config
file, perbaruiworktree
path sehingga menunjuk ke lokasi baru direktori kerja submodule..gitmodules
file di root repositori master, perbarui path ke direktori kerja submodule.git add -u
git add <parent-of-new-submodule-directory>
(Sangat penting bahwa Anda menambahkan orang tua , dan bukan direktori submodule itu sendiri.)Beberapa catatan:
[submodule "submodule-name"]
garis dalam.gitmodules
dan.git/config
harus cocok satu sama lain, tetapi tidak sesuai dengan apa-apa lagi..git
harus saling menunjuk dengan benar..gitmodules
dan.git/config
harus disinkronkan.sumber
String dalam tanda kutip setelah "[submodule" tidak masalah. Anda dapat mengubahnya ke "foobar" jika Anda mau. Ini digunakan untuk menemukan entri yang cocok di ". Git / config".
Karena itu, jika Anda melakukan perubahan sebelum menjalankan "git submodule init", itu akan berfungsi dengan baik. Jika Anda melakukan perubahan (atau mengambil perubahan melalui penggabungan), Anda harus mengedit secara manual .git / config atau menjalankan "git submodule init" lagi. Jika Anda melakukan yang terakhir, Anda akan dibiarkan dengan entri "terlantar" yang tidak berbahaya dengan nama lama di .git / config.
sumber
git submodule sync
menyebarkan perubahan ke.git/config
secara otomatisAnda bisa menambahkan submodule baru dan menghapus submodule lama menggunakan perintah standar. (harus mencegah kesalahan yang tidak disengaja di dalam. git)
Pengaturan contoh:
Coba pindahkan 'jquery' ke 'vendor / jquery / jquery':
Metode bonus untuk submodula besar:
Jika submodule besar dan Anda memilih untuk tidak menunggu klon, Anda dapat membuat submodule baru menggunakan yang lama sebagai asal, dan kemudian beralih asal.
Contoh (gunakan pengaturan contoh yang sama)
sumber
newPath
.Solusi yang diberikan tidak bekerja untuk saya, namun versi yang sama tidak ...
Ini dengan repositori kloning, maka repos submodule git terkandung dalam repositori top. Dir git. Semua kation berasal dari repositori atas:
Edit .gitmodules dan ubah pengaturan "path =" untuk submodule yang dimaksud. (Tidak perlu mengubah label, atau menambahkan file ini ke indeks.)
Edit .git / modules / name / config dan ubah pengaturan "worktree =" untuk submodule yang dimaksud
Lari:
Saya ingin tahu apakah ada bedanya jika repositori adalah atom, atau submodula relatif, dalam kasus saya itu relatif (submodule / .git adalah ref kembali ke topproject / .git / modules / submodule)
sumber
Cukup gunakan skrip shell git-submodule-move .
sumber
Saya baru saja mengalami cobaan ini kemarin dan jawaban ini bekerja dengan sempurna. Inilah langkah-langkah saya, untuk kejelasan:
more .gitmodules
karena begitu Anda menghapus submodule itu tidak akan adadeinit
,rm
lalusubmodule add
CONTOH
PERINTAH
CATATAN: git mv tidak melakukan ini. Sama sekali.
sumber
git mv
harus lebih baik di versi terakhir Git.mv
. Terima kasih!