Ganti nama submitule git

155

Apakah ada beberapa cara mudah untuk mengubah nama direktori submodule git (selain melalui seluruh gerakan menghapusnya dan menambahkannya kembali dengan nama tujuan baru).

Dan sementara kita berada di dalamnya, mengapa saya tidak bisa melakukan hal berikut di direktori induk: git mv old-submodule-name new-submodule-name

Lars Tackmann
sumber
6
Anda tidak perlu lagi memperbarui .gitmodulessecara manual saat memindahkan submodule. lihat jawaban saya di bawah ini
VonC
Jawaban @ VonC bekerja seperti pesona bagi saya
laconbass
Modul Git terlalu rumit. npmmenunjukkan cara kerja sederhana. Suatu hari ... mungkin ... seseorang ... akan menulis ulang ... sementara itu ...
Rolf
@ VonC menjawab bukan cerita lengkap hari ini: itu memang akan mengubah .gitmodules, tetapi hanya akan mengubah nama jalan, bukan nama modul. Anda memerlukan suntingan tambahan untuk .gitmodules untuk memperbaikinya dan 'git submodule sync' untuk menyelesaikan proses lengkap
zertyz
@zertyz: Properti [submodule "name_of_submodule"] adalah nama internal Git, Anda dapat mengganti nama untuk tidak membingungkan diri sendiri tetapi itu hanya sebuah label.
MKesper

Jawaban:

101

Saya menemukan alur kerja berikut berfungsi:

  • Perbarui .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Catatan: pendekatan ini tidak memperbarui indeks dan .gitmodules dengan benar di versi 2018 GIT.

Catatan: Anda mungkin dapat sekarang hanya melakukan git mv oldpath newpathsekarang, sebagai keluar menunjuk di VonC 's jawaban . (Pastikan Anda menggunakan git versi terbaru)

Mariusz Nowak
sumber
22
catatan untuk diri sendiri: untuk git add newpathtidak menggunakan garis miring
atom
10
Dengan alur kerja seperti itu, Anda hanya akan membuat symlink ke sub-direktori yang Anda gunakan sebagai submodule. Symlink hanyalah bagian dari fungsi submodule global. Ini berarti bahwa ketika Anda mengkloning repo yang menggunakan submodule yang diubah namanya, Anda dapat mengakhiri dengan kesalahan berikut: Tidak ada pemetaan submodule yang ditemukan di .gitmodules untuk path 'your-oldpath' Setelah Anda menghapus oldpath (* git rm oldpath ), Anda harus gunakan git submodule, tambahkan REPO-URL newpath, bukannya "git add newpath *. Setelah selesai, status git akan menampilkan sesuatu seperti ini: berganti nama: oldpath -> newpath
Bertrand
5
Solusi ini tidak berfungsi untuk saya karena ketika menggunakan perintah git add, submodule dimasukkan ke dalam proyek sebagai direktori sederhana dan bukan sebagai submodule. coba $ mv submodule-oldpath ~ / lokasi lain $ git rm submodule-oldpath $ git submodule tambahkan submodule-repositori-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam
3
Jika Anda memiliki masalah dengan pohon kerja, Anda juga dapat mengedit .git/modules/SUBMODULE/configfile, sehingga worktreemenunjuk ke direktori yang benar lagi.
Vincent Ketelaars
3
Ini tidak bekerja untuk saya dengan git 2.13.1. Tetapi hanya melakukan git mv old newpekerjaan seperti pesona. Saya hanya perlu melakukan git commit untuk menyelesaikan perubahan.
pengguna
225

Git1.8.5 (Oktober 2013) harus menyederhanakan proses . Cukup lakukan:

git mv A B

" git mv A B", ketika memindahkan submodule Atelah diajarkan untuk memindahkan pohon kerjanya dan untuk menyesuaikan jalur di .gitmodulesfile .


Lihat lebih banyak di komit 0656781fadca1 :

Saat ini menggunakan " git mv" pada suatu submodule memindahkan pohon kerja submodule di dalam proyek super. Tetapi pengaturan jalur submodule .gitmodulesdibiarkan tidak tersentuh, yang sekarang tidak konsisten dengan pohon kerja dan membuat perintah git yang bergantung pada perilaku path -> name mapping(suka statusdan diff) yang tepat.

Biarkan " git mv" bantuan di sini dengan tidak hanya memindahkan pohon kerja submodule tetapi juga memperbarui " submodule.<submodule name>.path" pengaturan dari .gitmodulesfile dan tahap keduanya.
Ini tidak terjadi ketika tidak ada .gitmodulesfile ditemukan dan hanya mengeluarkan peringatan ketika tidak memiliki bagian untuk submodule ini. Ini karena pengguna mungkin hanya menggunakan gitlink biasa tanpa .gitmodulesfile atau telah memperbarui pengaturan jalur dengan tangan sebelum mengeluarkan perintah "git mv" (dalam hal ini peringatan mengingatkannya bahwa mvakan melakukannya untuknya).
Hanya ketika .gitmodulesditemukan dan mengandung konflik gabungan mvperintah akan gagal dan memberi tahu pengguna untuk menyelesaikan konflik sebelum mencoba lagi.


git 2.9 (Juni 2016) akan meningkat git mvuntuk submodule:

Lihat komit a127331 (19 Apr 2016) oleh Stefan Beller ( stefanbeller) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 9cb50a3 , 29 Apr 2016)

mv: memungkinkan memindahkan submodules bersarang

" git mv old new" tidak menyesuaikan jalur untuk submodule yang hidup sebagai subdirektori di dalam old/direktori dengan benar.

Namun submodules perlu memperbarui tautannya ke direktori git serta pembaruan ke .gitmodulesfile.

VONC
sumber
Catatan untuk diri sendiri: Coba ini di 1.8.4 dan Anda akan memilikinya fatal: source directory is empty, source=my_source, destination=my_destination. Akan mencoba ini lagi ketika 1.8.5 memiliki rilis stabil.
checksum
@checksum Tapi 1.8.5 memiliki rilis yang stabil, untuk setidaknya beberapa ... jam;) github.com/git/git/releases/tag/v1.8.5
VonC
Saya harus membangun Git versi 1.8.5.GIT dari kode sumber karena ada Git v.1.7.5 di repositori Ubuntu. Cara membangun Git dari kode sumber
Maksim Dmitriev
2
@ MaksimDmitriev tetapi bagaimana dengan ppa (Arsip Paket Pribadi) yang saya sebutkan di stackoverflow.com/a/20918469/6309 ?
VonC
1
git mv tidak berfungsi untuk keperluan ini di komputer saya.
Alexander Dyagilev
11

Saya baru saja mencoba beberapa yang disarankan di atas. Saya sedang berlari:

$ git --version
git version 1.8.4

Saya menemukan yang terbaik adalah de-init submodule, hapus direktori dan buat submodule baru.

git submodule deinit <submodule name>

git rm <submodule folder name>

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

Setidaknya itulah yang paling berhasil bagi saya. YMMV!

jaredwolff
sumber
7

Anda tidak dapat mengganti nama, jadi Anda harus menghapusnya dulu ( deinit) dan menambahkannya lagi.

Jadi setelah menghapusnya:

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

Anda juga dapat memeriksa dan menghapus referensi untuk itu di:

  • .gitmodules
  • .git/config
  • hapus folder referensi dari .git/modules/<name>(terbaik untuk membuat cadangan), karena setiap folder memiliki configfile tempat menyimpan referensiworktree

lalu ubah perubahan Anda dengan melakukan perubahan pada repo Anda dengan:

git commit -am 'Removing submodule.'

dan periksa kembali jika Anda tidak memiliki masalah dengan:

git submodule update
git submodule sync
git submodule status

jadi sekarang Anda dapat menambahkan submitule git lagi:

git submodule add --name <custom_name> [email protected]:foo/bar.git <my/path>
kenorb
sumber
juga sebenarnya hari ini
Alexey
Judul pertanyaan adalah nama yang salah, itu berkaitan dengan jalan, bukan nama
Max Robbertze
3

Edit file .gitmodules untuk mengganti nama submodule dan kemudian ganti nama direktori submodule.

Saya pikir Anda mungkin perlu melakukan git submodule syncsetelahnya, tetapi saya tidak dalam posisi untuk memeriksa sekarang.

Abizern
sumber
Ini menyebabkan nama submodule baru muncul sebagai komit baru dan bukan sebagai nama baru. Tapi mungkin memang begitulah seharusnya?
Lars Tackmann
1
@ Lars: Pastikan juga untuk menghapus direktori submodule yang lama!
Cascabel
3

MacO : Ketika saya ingin menggunakan solusi VonC untuk mengubah folder submodule Commonmenjadi huruf kecil:

git mv Common common

saya mendapat

fatal: penggantian nama 'Common' gagal: Argumen tidak valid

Solusi - gunakan beberapa nama folder sementara dan pindahkan dua kali:

git mv Common commontemp
git mv commontemp common

Itu saja :)

Kamil Kiełczewski
sumber