Masalah dengan menambahkan kode umum sebagai git submodule: "sudah ada dalam indeks"

225

Saya baru mengenal git dan akan sangat menghargai bantuan dengan menambahkan submodules. Saya telah menerima dua proyek berbagi beberapa kode umum. Kode bersama hanya disalin ke dua proyek. Saya membuat repo git terpisah untuk kode umum dan menghapusnya dari proyek dengan rencana untuk menambahkannya sebagai submodule git.

Saya menggunakan opsi path dari git submodule add untuk menentukan folder:

git submodule add url_to_repo projectfolder

tapi kemudian mendapat kesalahan:

'projectfolder' already exists in the index"

Ini adalah struktur repositori yang saya inginkan:

repo
|-- projectfolder
    |-- folder with common code

Dimungkinkan untuk menambahkan submitule git langsung di repo atau ke folder baru di sana, tetapi tidak di folder proyek. Masalahnya adalah itu benar-benar perlu ada di folder proyek .. Apa yang bisa saya lakukan tentang ini dan apa yang saya salah pahami tentang opsi path dari git submodule add?

Vanja
sumber
Apa yang Anda dapatkan jika melakukannya git ls-files --stage projectfolder?
Mark Longair
Saya mendapatkan daftar dengan semua konten yang dimulai dengan 100644.
Vanja
8
bagi saya melakukan git rmpada folder yang ada membantu: |
rogerdpack

Jawaban:

343

Saya khawatir tidak ada informasi yang cukup dalam pertanyaan Anda untuk memastikan tentang apa yang terjadi, karena Anda belum menjawab pertanyaan tindak lanjut saya, tetapi ini mungkin bisa membantu.

Kesalahan itu berarti projectfoldersudah dipentaskan ("sudah ada dalam indeks"). Untuk mencari tahu apa yang terjadi di sini, cobalah mendaftar semua yang ada di indeks di bawah folder itu dengan:

git ls-files --stage projectfolder

Kolom pertama dari output itu akan memberi tahu Anda apa jenis objek dalam indeks di projectfolder. (Ini terlihat seperti filem Unix, tetapi memiliki arti khusus dalam git.)

Saya menduga Anda akan melihat sesuatu seperti:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(yaitu baris yang diawali dengan 160000), dalam hal ini repositori di projectfoldertelah ditambahkan sebagai "gitlink". Jika tidak muncul di output of git submodule, dan Anda ingin menambahkannya kembali sebagai submodule, Anda dapat melakukan:

git rm --cached projectfolder

... untuk melepas panggung, lalu:

git submodule add url_to_repo projectfolder

... untuk menambahkan repositori sebagai submodule.

Namun, mungkin juga Anda akan melihat banyak blob terdaftar (dengan mode file 100644dan 100755), yang akan menyarankan kepada saya bahwa Anda tidak melakukan unstage file dengan benar projectfoldersebelum menyalin repositori baru ke tempatnya. Jika itu masalahnya, Anda dapat melakukan yang berikut untuk menghapus semua file tersebut di atas panggung:

git rm -r --cached projectfolder

... lalu tambahkan submodule dengan:

git submodule add url_to_repo projectfolder
Mark Longair
sumber
13
Terima kasih untuk jawaban terperinci Anda. Saya melakukan "git rm -r --cached projectfolder" dan mencoba membuka submodule lagi. Namun kali ini saya mendapatkan pesan kesalahan "'projectfolder' sudah ada dan bukan repo git yang valid".
Vanja
3
@ Vanja: Itu menunjukkan bahwa projectfoldertidak mengandung .gitdirektori. Itu terdengar dari pertanyaan Anda seolah-olah Anda telah membuat repositori baru untuk projectfoldertempat lain, dan menyalinnya ke tempatnya, tetapi jelas bukan itu masalahnya. Anda harus memindahkan yang sudah ada projectfolder, dan kemudian salin repositori baru (lengkap dengan .gitdirektori) ke tempatnya sebelum menambahkan sebagai submodule. Atau, jika Anda sudah mendorongnya ke repositori yang diwakili oleh url_to_repo, Anda bisa projectfolderkeluar dari jalan dan kemudian menambahkan submodule dari URL itu.
Mark Longair
+1 mengagumkan sepanjang jalan
abbood
Ini membantu saya satu ton. Terima kasih!
Evan Moran
1
Inilah yang saya lakukan, yaitu proses 3 langkah LANGKAH 1: git rm -r --cached src / test / resources /, LANGKAH 2: menghapus direktori sumber daya yang ada ke beberapa tempat lain, LANGKAH 3: submodule git tambahkan add url_to_repo src / tes / sumber daya
vikramvi
52

Menghapus submodule secara manual melibatkan sejumlah langkah dan ini berhasil untuk saya.

Dengan asumsi Anda berada di direktori root proyek dan nama modul contoh git adalah "c3-pro-ios-framework"

Hapus file yang terkait dengan submodule

rm -rf .git/modules/c3-pro-ios-framework/

Hapus referensi untuk submodule di konfigurasi

vim .git/config

masukkan deskripsi gambar di sini

Hapus .gitmodules

rm -rf .gitmodules

Hapus dari cache tanpa "git"

git rm --cached c3-pro-ios-framework

Tambahkan submodule

git submodule add https://github.com/chb/c3-pro-ios-framework.git
Gajen Sunthara
sumber
2
Pos yang bagus, bekerja dengan sangat baik. Anda senang membagikannya, tuan. Benar benar hebat.
gabn88
1
Saya mencoba mendaftar submodula melalui git submodulesetelah penghapusan dan sebelum menambahkan dan itu memberi saya kesalahan, melakukan penghapusan merawatnya.
mehmet
1
Saya akan mengungguli 50x ini jika saya bisa; Anda baru saja menyelamatkan hari saya!
Sensei James
touch .gitmodules(harus ada di pohon yang berfungsi, jadi menghapusnya membantu. Tapi Anda perlu menambahkannya kembali). Btw pos yang luar biasa. Satu-satunya yang bekerja di sini.
Torxed
Itu adalah .gitdirektori yang masih memiliki sisa-sisa untuk saya. Ini bekerja dengan baik. Terima kasih.
Kevin Anderson
44

Anda perlu menghapus repositori git submodule Anda (projectfolder dalam kasus ini) terlebih dahulu untuk path git.

rm -rf projectfolder

git rm -r projectfolder

dan kemudian tambahkan submodule

git submodule add <git_submodule_repository> projectfolder
Neeraj Kumar
sumber
4
git submodule add --force <git_submodule_repository>bekerja untuk saya untuk menjaga nama submodul yang sama
Tenfrow
1
Terima kasih!! Saya tidak perlu menambahkan dalam folder proyek, saya hanya berubah menjadi subdirektori dan klon dari sana.
Tony Fraser
32

Saya memiliki masalah yang sama dan setelah berjam-jam mencari menemukan jawabannya.

Kesalahan yang saya dapatkan sedikit berbeda: <path> already exists and is not a valid git repo(dan ditambahkan di sini untuk nilai SEO)

Solusinya adalah TIDAK membuat direktori yang akan menampung submodule. Direktori akan dibuat sebagai bagian dari git submodule addperintah.

Selain itu, argumennya diharapkan relatif terhadap root induk-repo, bukan direktori kerja Anda, jadi waspadalah.

Solusi untuk contoh di atas:

  1. Tidak masalah jika repo orang tua Anda sudah dikloning.
  2. Pastikan common_codedirektori tidak ada.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Perhatikan garis miring yang diperlukan. )
  5. Sanity dipulihkan.

Saya harap ini membantu seseorang, karena sangat sedikit informasi yang dapat ditemukan di tempat lain tentang ini.

tidak terdefinisi
sumber
1
Langkah 4 harus dimulai git submodule add, dan garis miring tidak diperlukan.
nullability
Memperbaiki kesalahan ketik. Saya telah menguji ulang, dan garis miring telah membuat perbedaan bagi saya. Saya menggunakan zsh jika itu berpengaruh.
undefined
Ini menyelesaikan masalah saya (membuat direktori dengan perintah add submodule), terima kasih!
jackJoe
18

jika ada folder bernama di xbawah kontrol git, Anda ingin menambahkan submodule nama yang sama, Anda harus menghapus folder xdan komit dulu .

Diperbarui oleh @ ujjwal-singh:

Komitmen tidak diperlukan, pementasan sudah cukup .. git add/git rm -r

justbilt
sumber
Komitmen adalah apa yang saya lewatkan. Jawaban singkat, tapi benar!
Qqwy
3
Komitmen tidak diperlukan, pementasan sudah mencukupi .. git add/gir rm -r
Ujjwal Singh
3

Hanya untuk mengklarifikasi dalam bahasa manusia apa kesalahan yang coba disampaikan kepada Anda:

Anda tidak dapat membuat repositori di folder ini yang sudah dilacak di repositori utama.

Sebagai contoh: Anda memiliki folder tema yang disebut AwesomeThemerepositori khusus, Anda coba lakukan dump langsung ke repositori utama git submodule add sites/themesAnda dan Anda mendapatkannya "AwesomeTheme" index already exists.

Anda hanya perlu memastikan belum ada sites/themes/AwesomeThemedi pelacakan versi repositori utama sehingga submodule dapat dibuat di sana.

Jadi untuk memperbaikinya, di repositori utama Anda jika Anda memiliki sites/theme/AwesomeThemedirektori kosong lalu hapus. Jika Anda telah membuat komit dengan sites/theme/AwesomeThemedirektori di repositori utama Anda, Anda perlu membersihkan semua riwayatnya dengan perintah seperti ini:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Sekarang kamu bisa lari git submodule add [email protected] sites/themes/AwesomeTheme

Karena repositori utama belum pernah melihat apa pun (alias index'd) sites/themes/AwesomeThemesebelumnya, sekarang ia dapat membuatnya.

Dylan Pierce
sumber
1

Saya membuatnya bekerja dengan melakukannya sebaliknya. Dimulai dengan repo kosong, menambahkan submodule di folder baru yang disebut "projectfolder / common_code". Setelah itu dimungkinkan untuk menambahkan kode proyek dalam folder proyek. Detailnya ditunjukkan di bawah ini.

Dalam jenis repo kosong:

git submodule add url_to_repo projectfolder/common_code

Itu akan membuat struktur folder yang diinginkan:

repo
|-- projectfolder
    |-- common_code

Sekarang dimungkinkan untuk menambahkan lebih banyak submodul, dan kode proyek dapat ditambahkan ke folder proyek.

Saya belum bisa mengatakan mengapa cara ini berhasil dan bukan yang lain.

Vanja
sumber
0

Tidak tahu apakah ini berguna, meskipun saya memiliki masalah yang sama ketika mencoba untuk melakukan file saya dari dalam IntelliJ 15. Pada akhirnya, saya membuka SourceTree dan di sana saya hanya bisa melakukan file. Masalah terpecahkan. Tidak perlu mengeluarkan perintah fancy git. Sebut saja kalau-kalau ada orang yang memiliki masalah yang sama.

Lawrence
sumber
0

Pergi ke folder repositori. Hapus submodules yang relevan dari .gitmodules. Pilih tampilkan file yang disembunyikan. Buka folder .git, hapus submodul dari folder modul dan konfig.

Sam Biswas
sumber
0

Ini terjadi jika file .git hilang di jalur target. Itu terjadi pada saya setelah saya dieksekusi git clean -f -d.

Saya harus menghapus semua folder target yang ditampilkan dalam pesan dan kemudian mengeksekusi git submodule update --remote

Hitam
sumber
-18

Di dir git Anda, misalkan Anda telah menyinkronkan semua perubahan.

rm -rf .git 

rm -rf .gitmodules

Kemudian lakukan:

git init
git submodule add url_to_repo projectfolder
seektrue
sumber
2
ini akan menghapus seluruh sejarah proyek!
redbandit