Git: fatal: Pathspec berada dalam submodule

145

Saya mencoba membuat TravisCI menggunakan situs statis Hakyll saya secara otomatis, menurut panduan ini .

Begini cara repo saya diatur. Saya memiliki cabang sumber saya, yang berisi file hakyll dan markdown saya. Itu membangun html ke _sitedirektori, yang diatur sebagai submodule, ditautkan ke mastercabang saya .

Saya membangun situs tanpa masalah, lalu cdke direktori _site. Namun, ketika saya mencoba git add ./*file HTML yang baru dibuat, saya mendapatkan kesalahan berikut:

fatal: Pathspec './about.html' is in submodule '_site'

Ketika saya mencoba git add --all, saya mendapatkan kesalahan ini:

git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed.

/home/travis/build.sh: line 245: 1566 Aborted git add --all

Apa yang menyebabkan ini, dan bagaimana saya bisa menghindari ini?

Anda dapat melihat repositori di sini .

Ya ampun
sumber

Jawaban:

430

Menghapus direktori dari git dan menambahkannya lagi bekerja untuk saya:

 git rm --cached directory
 git add directory

Ini berfungsi jika Anda sengaja menghapus .gitdirektori karena Anda ingin menambah directoryproyek git utama Anda. Dalam kasus spesifik saya, saya telah mengkloning ekstensi dan berlari git add .tanpa berpikir terlalu banyak. Git memutuskan untuk membuat submodule, yang saya tidak suka. Jadi saya dihapus directory/.gitdan bertemu Git: fatal: Pathspec is in submodule. Saya tidak bisa menemukan cara menghapus barang submodule. Diperbaiki dengan dua garis di atas.

kqw
sumber
8
Ini memecahkan masalah yang saya alami ketika saya secara tidak sengaja menarik sebuah proyek ke dalam proyek yang sudah ada, membuat submodule. Saya telah mencoba hampir setiap saran di luar sana. Menghapus direktori dan menambahkan lagi mengatasi masalah saya. Terima kasih.
RevNoah
Saya punya .git dan lihat itu! Tetapi ketika saya ingin melakukan beberapa file yang terletak di folder, itu menunjukkan kesalahan "blahblah tidak cocok dengan file apa pun yang dikenal git"
Dr.jacky
Ini memperbaiki masalah. Dalam kasus saya, saya mengkloning proyek di komputer lain.
AntonIva
Saya mengalami masalah yang sama dengan proyek Visual Studio yang saya selaraskan dengan GitHub. Folder tempat sebagian besar pengembangan saya berlangsung tidak dilacak, dan jika saya mencoba menambahkannya saya mendapatkan kesalahan yang sama. Solusi ini memperbaikinya untuk saya juga!
JohnRDOrazio
10

Tampaknya git addkonteksnya adalah repo induk ("parent" berarti yang termasuk submodule), yang memicu peringatan.

Coba dan ubah konteksnya dengan:

cd _site
git --git-dir=.git --work-tree=. add . 
git --git-dir=.git --work-tree=. commit -m "new files"

Jangan lupa bahwa, jika ini berhasil, Anda masih harus kembali ke induk repo, dan git add _site, karena subrepo akan mengalami perubahan.

Dan Anda harus mendorong keduanya.


Perbarui Januari 2017 (2+ tahun kemudian)

Dengan Git 2.12, Anda tidak akan melihatnya prefix_pathspec: Assertionlagi.

Lihat komit 2d81c48 (09 Jan 2017) oleh Stefan Beller ( stefanbeller) .
Dibantu-oleh: Jeff King ( peff) , dan Junio ​​C Hamano ( gitster) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 00880a1 , 18 Jan 2017)

pathspec: beri pesan yang lebih baik untuk pathspeckesalahan terkait submodule

Menjalankan " git add a/b" ketika " a" adalah sebuah submodule yang benar salah, tetapi tanpa pesan kesalahan yang berarti.

VONC
sumber
Saya mendapatkan error: unknown option git-dir = .git'`. Juga, saya tidak dapat melakukan repo orang tua saya dari dalam Travis, yang akan menyebabkan loop tak terbatas dari Travis berjalan ...
jmite
@iteite Saya telah memperbaiki jawabannya: --git-dirdan --work-treemerupakan opsi dari gitperintah, bukan git addperintah. Cobalah setidaknya git addbagian, jika git committidak praktis.
VonC
Ini sepertinya menghancurkan sesuatu untuk saya, tetapi saya dapat menemukan solusinya di sini
CGTheLegend
4

Sepertinya masalah saya adalah saya tidak sengaja menghapus .gitfolder submodule.

Ya ampun
sumber
1
Saya memiliki masalah yang persis sama. Bisakah Anda berbagi bagaimana Anda menyelesaikannya?
matt
Saya menyelesaikannya dengan mengubah skrip saya untuk tidak menghapus folder .git. Jadi saya sarankan Anda memeriksa skrip Anda, lihat apakah Anda benar-benar memiliki folder .git di direktori.
jmite
1
Saya lakukan tetapi saya ingin menyingkirkannya karena repo jarak jauh tidak ada lagi. Lebih mudah bagi kita untuk memasukkan kode sumbernya apa adanya.
matt
Maka Anda yang terbaik adalah melihat mengubah repo jarak jauh. Lihatlah git remoteperintahnya.
jmite
3

Sepertinya Anda beroperasi pada submodula yang tidak diinisialisasi (pada dasarnya .gitdirektori tersebut hilang ), oleh karena itu Anda harus menginisialisasi mereka terlebih dahulu dan memperbarui:

git submodule init
git submodule update

Kalau tidak, jika Anda tidak membutuhkan lagi submodule ini, hapus dengan:

git submodule deinit _site

atau:

git rm -f --cached _site

dan tambahkan lagi:

git add _site

Periksa submodul luar biasa Anda saat ini dengan: git submodule status.

Lihat juga: Mengapa kesalahan git dengan 'Pernyataan gagal' di git add.?

kenorb
sumber
1

Perbaikan 100% untuk masalah ini, bahkan jika Anda memiliki lebih dari satu direktori submodule di dalam proyek:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
John Smit Conor
sumber