Seperti yang disebutkan dalam posting blog Mark Longair, Git Submodules Dijelaskan ,
Versi 1.7.0 dan yang lebih baru dari git berisi perubahan yang mengganggu dalam perilaku submisi git.
Submodules sekarang dianggap kotor jika mereka memiliki file yang dimodifikasi atau file yang tidak terlacak , sedangkan sebelumnya hanya akan menjadi kasus jika KEPALA dalam submodule menunjuk komit yang salah.
Arti tanda tambah ( +
) dalam output dari submitule git telah berubah, dan pertama kali Anda menemukan ini, perlu sedikit waktu untuk mencari tahu apa yang salah, misalnya dengan melihat melalui changelogs atau menggunakan git bisect pada git .git untuk menemukan perubahannya. Akan jauh lebih baik bagi pengguna untuk memperkenalkan simbol yang berbeda untuk "pada versi yang ditentukan, tetapi kotor".
Anda dapat memperbaikinya dengan:
baik melakukan atau membatalkan perubahan / evolusi dalam setiap submodul Anda, sebelum kembali ke induk repo (di mana diff seharusnya tidak melaporkan file "kotor" lagi). Untuk membatalkan semua perubahan pada submodule Anda, cd
masuk ke direktori root dari submodule Anda dan lakukangit checkout .
komentar dotnetCarpenter yang dapat Anda lakukan:git submodule foreach --recursive git checkout .
atau tambahkan --ignore-submodules
ke git diff
, untuk sementara waktu mengabaikan submodul yang "kotor" itu.
Baru di Git versi 1.7.2
Seperti komentar Noam di bawah , pertanyaan ini menyebutkan bahwa, sejak git versi 1.7.2, Anda dapat mengabaikan submodul kotor dengan:
git status --ignore-submodules=dirty
git commit -a
tanpa harus khawatir menambahkan perubahan ini. Meskipun mereka ditandai denganM
di depan, mereka tidak akan berakhir di komit Anda.git clean -id
.git submodule foreach --recursive git clean -id
(untuk diuji dalam repo cadangan pertama;)).gitignore
. Menambahkannya di sana atau ke daftar abaikan global saya memperbaiki hal-hal.Juga menghapus submodule dan kemudian berjalan
git submodule init
dangit submodule update
jelas akan melakukan trik, tetapi mungkin tidak selalu sesuai atau mungkin.sumber
Untuk mengabaikan semua file yang tidak dilacak dalam submodule apa pun, gunakan perintah berikut untuk mengabaikan perubahan itu.
Ini akan menambahkan opsi konfigurasi berikut ke konfigurasi git lokal Anda:
Informasi lebih lanjut dapat ditemukan di sini
sumber
EDIT : Jawaban ini (dan sebagian besar yang lain) sudah usang; lihat jawaban Devpool sebagai gantinya .
Awalnya, tidak ada opsi konfigurasi untuk dibuat "
git diff --ignore-submodules
" dan "git status --ignore-submodules
" default global (tetapi lihat juga Menetapkan flag default git pada perintah ). Alternatifnya adalah dengan menetapkanignore
opsi konfigurasi default pada setiap submodule yang ingin Anda abaikan (untuk keduanyagit diff
dangit status
), baik dalam.git/config
file (hanya lokal) atau.gitmodules
(akan diversi oleh git). Sebagai contoh:ignore = untracked
untuk mengabaikan hanya file yang tidak dilacak,ignore = dirty
juga mengabaikan file yang dimodifikasi, danignore = all
mengabaikan juga komitmen. Tampaknya tidak ada cara untuk wildcard itu untuk semua submodula.sumber
Ini terjadi karena pointer yang Anda miliki untuk submodule bukan apa yang sebenarnya ada di direktori submodule. Untuk memperbaiki ini, Anda harus menjalankan
git submodule update
lagi:sumber
Ini tidak melakukan trik untuk saya tetapi memberi saya daftar file (dalam kasus saya hanya satu) yang telah diubah dalam submodule (tanpa saya melakukan apa pun di sana).
Jadi saya bisa menuju ke submodule dan status git menunjukkan kepada saya bahwa KEPALA saya terlepas -> master checkout git, status git untuk melihat file yang dimodifikasi sekali lagi, git checkout> nama file <, git pull dan semuanya baik-baik saja.
sumber
Saya akhirnya menghapus direktori submodule dan menginisialisasi sekali lagi
sumber
Sebuah submodule dapat ditandai sebagai kotor jika pengaturan filemode diaktifkan dan Anda mengubah izin file di subtree submodule.
Untuk menonaktifkan filemode dalam submodule, Anda dapat mengedit /.git/modules/path/to/your/submodule/config dan menambahkan
Jika Anda ingin mengabaikan semua status kotor, Anda dapat menyetel
ignore = dirty
properti di file /.gitmodules , tapi saya pikir lebih baik menonaktifkan saja file mode .sumber
Dalam kasus saya, saya tidak yakin apa yang menyebabkan ini terjadi, tetapi saya tahu saya hanya ingin agar submodule diatur ulang ke komit jarak jauh terbaru mereka dan selesai dengan itu. Ini melibatkan menggabungkan jawaban dari beberapa pertanyaan berbeda di sini:
git submodule update --recursive --remote --init
Sumber:
Bagaimana cara mengembalikan perubahan saya ke submodule git?
Cara mudah untuk menarik submodula terbaru dari semua git
sumber