Saya memiliki submodule git (RestKit) yang telah saya tambahkan ke repo saya.
Saya tidak sengaja mengubah beberapa file di sana dan saya ingin kembali ke versi sumber. Untuk melakukan itu, saya mencoba lari
Mac:app-ios user$ git submodule update RestKit
Tetapi seperti yang Anda lihat di sini, ini tidak berfungsi karena masih "konten yang dimodifikasi":
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Bahkan
Mac:app-ios user$ git submodule update -f RestKit
tidak mengembalikan file yang dimodifikasi secara lokal.
Bagaimana cara mereset konten submodule itu?
git
git-submodules
Eric
sumber
sumber
git reset --hard
tidak berhasil, pertama-tama coba tentukan cabang jarak jauh dengangit reset --hard origin/<branch_name>
.Jawaban:
Pindah ke direktori submodule, lalu lakukan
git reset --hard
untuk mengatur ulang semua file yang diubah ke status komitmen terakhir mereka. Ketahuilah bahwa ini akan membuang semua perubahan yang tidak dilakukan.sumber
git submodule update --init
bekerja untuk saya; tanpanya--init
tidak bekerja sama sekali.git submodule update -f --init
untuk kasus saya.Jika Anda ingin melakukan ini untuk semua submodul, tanpa harus mengubah direktori, Anda dapat melakukannya
git submodule foreach git reset --hard
Anda juga dapat menggunakan bendera rekursif untuk diterapkan ke semua submodul:
git submodule foreach --recursive git reset --hard
sumber
git submodule foreach --recursive git clean -x -f -d
Metode yang lebih aman dari semua jawaban sebelumnya:
Perintah pertama benar-benar "melepaskan" semua submodul, yang kedua kemudian membuat checkout baru dari mereka.
Dibutuhkan lebih lama daripada metode lain, tetapi akan bekerja apa pun keadaan submodul Anda.
sumber
error: Your local changes to the following files would be overwritten by checkout
*
sayaPS1
yanggit status -uno
tidak dapat menjelaskan).Bagi saya, memiliki
atur ulang submodule ke status di mana ia diperiksa, tidak perlu ke komit / status referensi repo utama. Saya masih akan memiliki "konten yang dimodifikasi" seperti kata OP. Jadi, untuk mendapatkan kembali submodule ke komit koreksi, saya menjalankan:
Lalu ketika saya melakukannya
git status
, itu bersih pada submodule.sumber
submodule update --init
sepertinya tidak mengembalikan modifikasi lokal dalam kasus saya: |lakukan 4 langkah berurutan:
sumber
git submodule update
adalah apa yang diperbaiki(new commits)
untuk saya.Ini bekerja untuk saya, termasuk secara rekursif menjadi submodula (mungkin itu sebabnya -f Anda tidak berfungsi, karena Anda mengubah submodule di dalam submodule):
sumber
Pertama coba ini, seperti yang orang lain katakan:
Jika itu tidak berhasil, ubah ke direktori submodule dan gunakan perintah berikut untuk melihat apakah ada perubahan pada submodule:
Jika ada perubahan pada submodule Anda, singkirkan. Pastikan Anda tidak dapat melihat perubahan apa pun saat menjalankan "git status".
Selanjutnya, kembali ke repositori utama dan jalankan "git submodule update --init" lagi.
sumber
Sejak Git 2.14 (Q3 2017), Anda tidak harus masuk ke setiap submodule untuk melakukan
git reset
(seperti padagit submodule foreach git reset --hard
)Itu karena git reset sendiri tahu sekarang bagaimana secara rekursif masuk ke submodules.
Lihat komit 35b96d1 (21 Apr 2017), dan komit f2d4899 , komit 823bab0 , komit cd279e2 (18 Apr 2017) oleh Stefan Beller (
stefanbeller
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 5f074ca , 29 Mei 2017)git-reset
adalah manipulator pohon yang berfungsi, yang harus diajarkan tentang submodul.Peringatan : perbedaan antara:
git reset --hard --recurse-submodule
dangit submodule foreach git reset --hard
adalah bahwa yang pertama juga akan mereset pohon induk repo induk utama Anda, karena yang terakhir hanya akan mengatur ulang pohon kerja submodula.
Jadi gunakan dengan hati-hati.
sumber
Untuk git <= 2.13 kedua perintah ini dikombinasikan akan mengatur ulang repo Anda dengan submodul rekursif:
sumber
Ini berfungsi dengan perpustakaan kami yang menjalankan GIT v1.7.1, di mana kami memiliki repo paket DEV dan repo paket LIVE. Repositori itu sendiri hanyalah cangkang untuk mengemas aset untuk suatu proyek. semua submodul.
LIVE tidak pernah diperbarui dengan sengaja, namun file cache atau kecelakaan dapat terjadi, sehingga repo kotor. Subkodul baru yang ditambahkan ke DEV juga harus diinisialisasi dalam LIVE.
Paket Repositori dalam DEV
Di sini kami ingin menarik semua perubahan hulu yang belum kami sadari, kemudian kami akan memperbarui repositori paket kami.
Paket Repositori dalam LIVE
Di sini kami ingin menarik perubahan yang dikomit ke repositori DEV, tetapi bukan perubahan hulu yang tidak diketahui.
sumber
Jika Anda ingin membuang semua perubahan di seluruh repositori bersama dengan sub modul, Anda dapat menggunakan
git restore . --recurse-submodules
Ini akan membatalkan semua perubahan yang dibuat dalam repositori dan dalam sub modul.
sumber
cara saya untuk mengatur ulang semua submodula (TANPA melepaskan & menjaga cabang "master" mereka):
git submodule foreach 'git checkout master && git reset --hard $ sha1'
sumber