Anda telah menambahkan vendor/plugins/open_flash_chart_2
entri "gitlink", tetapi tidak pernah mendefinisikannya sebagai submodule. Secara efektif Anda menggunakan fitur internal yang digunakan git submodule (entri gitlink) tetapi Anda tidak menggunakan fitur submodule itu sendiri.
Anda mungkin melakukan sesuatu seperti ini:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Perintah terakhir ini adalah masalahnya. Direktori vendor/plugins/open_flash_chart_2
dimulai sebagai repositori independen Git. Biasanya sub-repositori seperti itu diabaikan, tetapi jika Anda memberi tahu git menambahkan untuk menambahkannya secara eksplisit, maka itu akan membuat entri gitlink yang menunjuk ke komit HEAD sub-repositori alih-alih menambahkan isi direktori. Mungkin menyenangkan jika git menambahkan menolak untuk membuat "semi-submodules".
Direktori normal direpresentasikan sebagai objek pohon di Git; objek pohon memberi nama, dan izin ke objek yang dikandungnya (biasanya objek pohon dan gumpalan lainnya — direktori dan file, masing-masing). Submodules direpresentasikan sebagai entri “gitlink”; entri gitlink hanya berisi nama objek (hash) dari komit HEAD dari submodule. “Repositori sumber” untuk komit gitlink ditentukan dalam .gitmodules
file (dan .git/config
file setelah submodule diinisialisasi).
Apa yang Anda miliki adalah entri yang menunjuk ke komit tertentu, tanpa merekam repositori sumber untuk komit itu. Anda dapat memperbaikinya dengan membuat gitlink Anda menjadi submodule yang tepat, atau dengan menghapus gitlink dan menggantinya dengan konten “normal” (file biasa dan direktori).
Mengubahnya menjadi Submodule yang Tepat
Satu-satunya bit yang Anda lewatkan untuk didefinisikan dengan benar vendor/plugins/open_flash_chart_2
sebagai submodule adalah .gitmodules
file. Biasanya (jika Anda belum menambahkannya sebagai entri gitlink kosong), Anda hanya akan menggunakan git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Seperti yang Anda temukan, ini tidak akan berfungsi jika jalur sudah ada dalam indeks. Solusinya adalah untuk menghapus entri gitlink sementara dari indeks dan kemudian menambahkan submodule:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Ini akan menggunakan sub-repositori Anda yang sudah ada (yaitu tidak akan mengkloning kembali repositori sumber) dan menampilkan .gitmodules
file yang terlihat seperti ini:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Itu juga akan membuat entri serupa di repositori utama Anda .git/config
(tanpa path
pengaturan).
Komit itu dan Anda akan memiliki submodule yang tepat. Ketika Anda mengkloning repositori (atau mendorong ke GitHub dan mengkloning dari sana), Anda harus dapat menginisialisasi ulang submodule via git submodule update --init
.
Ganti dengan Konten Biasa
Langkah selanjutnya mengasumsikan bahwa sub-repositori Anda di vendor/plugins/open_flash_chart_2
tidak memiliki riwayat lokal yang ingin Anda pertahankan (yaitu semua yang Anda pedulikan adalah pohon kerja sub-repositori saat ini, bukan riwayat).
Jika Anda memiliki riwayat lokal di sub-repositori yang Anda pedulikan, maka Anda harus membuat cadangan .git
direktori sub-repositori sebelum menghapusnya di perintah kedua di bawah ini. (Pertimbangkan juga contoh subtit git di bawah ini yang menjaga sejarah HEAD sub-repositori).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Kali ini ketika menambahkan direktori, ini bukan sub-repositori, jadi file-file tersebut akan ditambahkan secara normal. Sayangnya, karena kami menghapus .git
direktori, tidak ada cara super mudah untuk menjaga hal-hal terbaru dengan repositori sumber.
Anda dapat mempertimbangkan menggunakan penggabungan subtree saja. Melakukan hal itu akan membuat Anda dengan mudah menarik perubahan dari repositori sumber sambil menjaga file "flat" di repositori Anda (tanpa submodul). Perintah subtree git pihak ketiga adalah pembungkus yang bagus di sekitar fungsionalitas penggabungan subtree.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Kemudian:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
git subtree juga memiliki --squash
opsi yang memungkinkan Anda menghindari memasukkan riwayat repositori sumber ke dalam riwayat Anda, tetapi masih memungkinkan Anda melakukan perubahan hulu.