Bagaimana cara mengembalikan pointer Submodule Git ke komit yang disimpan dalam repositori yang berisi?

128

Saya memiliki submodule git di repo git utama saya. Seperti yang saya pahami, repo utama menyimpan nilai SHA (di suatu tempat ...), menunjuk ke komit khusus dari submodule yang "ditautkan".

Saya masuk ke submodule dan mengetik git checkout some_other_branch. Saya tidak tahu dari komit mana saya berasal.

Saya ingin mengembalikan pointer itu sehingga repo utama dan submodule sudah sinkron lagi.

Insting pertama saya (mungkin naif) adalah mengatakan git reset --hard- yang tampaknya bekerja untuk yang lainnya. Yang mengejutkan saya, itu tidak berhasil untuk skenario ini.

Jadi saya sudah tahu bahwa saya bisa mengetik git diff, perhatikan SHA ID yang dimiliki oleh pointer submodule, dan kemudian menuju ke submodule dan git checkout [SHA ID]... tapi pasti harus ada cara yang lebih mudah?

Karena saya masih belajar tentang submission git, jangan ragu untuk memperbaiki terminologi saya jika ada kata-kata untuk konsep yang saya tidak tahu.

Menghancurkan
sumber

Jawaban:

167

Anda ingin memperbarui submodule Anda sehingga sinkron dengan apa yang diyakini oleh repositori induk. Inilah gunanya perintah pembaruan:

Dari halaman submodule:

Perbarui submodul terdaftar, yaitu klon submodul yang hilang dan
checkout komit yang ditentukan dalam indeks yang berisi
gudang. Ini akan membuat submodules HEAD terlepas kecuali
--rebase atau --merge ditentukan atau submodule kunci. $ name.update
diatur untuk rebase atau digabung.

Jalankan ini dan semua harus baik-baik:

git submodule update
Brian Riehman
sumber
4
Entah bagaimana, bagi saya saya perlu menambahkan --init. Tanpa itu, submodules akan tetap dalam kondisi dengan (new commits). Meskipun submodul saya sudah diinisialisasi.
Ambidex
@ Ambidex ya --initopsi sangat penting dalam semua ini. Saya diminta memasukkan nama pengguna dan kata sandi karena submodule saya dikloning melalui https. Saya masuk ke kedua folder dan mengatur remote untuk menggunakan sshprotokol untuk checkout.
A-Dubb
1
tidak berfungsi jika hash submodule commit dimodifikasi & tidak
dipentaskan
dapat menambahkan --recursive sehingga Anda tidak perlu pergi ke semua submodules
Gaspa79
21

Untuk mengubah komit yang ditunjuk oleh submodule, Anda perlu checkout versi itu dalam submodule, lalu kembali ke repo yang berisi, tambahkan dan komit perubahan itu.

Atau, jika Anda ingin submodule berada pada versi yang ditunjuk oleh repo top, lakukan git submodule update --recursive. Tambahkan --initjika Anda baru saja dikloning.

Juga, git submoduletanpa perintah submodule akan menunjukkan komit yang Anda tuju. Akan ada - atau + di depan komit jika tidak sinkron.

Jika Anda melihat pohon dengan submodule di dalamnya, Anda dapat melihat bahwa submodule ditandai sebagai yang commitbertentangan dengan yang lainnya adalah gumpalan atau pohon.

untuk melihat apa yang dilakukan komit tertentu kepada submodul, Anda dapat:

git ls-tree <some sha1, or branch, etc> Submodule/path

Anda kemudian dapat melihat komit atau apa pun jika Anda suka dengan memasukkannya ke dalam log, dll. ( git-diropsi pada tingkat perintah git memungkinkan Anda untuk melewati keharusan cd ke submodule):

git --git-dir=Submodule/path log -1 $(<the above statement>)
Adam Dymitruk
sumber
Perintah di bawah ini membantu saya (saya ingin mengabaikan perubahan dalam submodule dan dalam modul saya juga): git submodule update --init --recursive
Rajesh Goel
6

Kasus lain yang baru saja saya temui adalah jika ada perubahan yang tidak bertahap dalam submodule yang ingin Anda buang. git submodule update tidak akan menghapus perubahan itu, git tidak akan mereset --hard pada direktori induk. Anda harus pergi ke direktori submodule dan melakukan git reset --hard. Jadi, jika saya ingin sepenuhnya menghapus perubahan yang tidak dipentaskan pada orang tua dan submodule saya, saya melakukan hal berikut:

Dalam Induk:

git reset --hard

git submodule update

Dalam Submodule:

git reset --hard
Benjamin Noffsinger
sumber
5

Gunakan git ls-tree HEADdi folder "superproject" untuk melihat komitmen awal dari submodule Anda. Kemudian ubah ke direktori submodule dan gunakan git log --oneline --decorateuntuk melihat cabang apa yang komit asli aktif. Akhirnya git checkout original-commit-branch,.

Menggunakan beberapa direktori pengujian yang saya atur, inilah yang akan terlihat seperti perintah:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"Superproject" menunjukkan submodule sm2 di commit f68bed6tetapi sm2 memiliki HEAD at 5b8d48f. Komit submodule f68bed6memiliki tiga cabang di atasnya yang dapat digunakan untuk checkout di direktori submodule.

Dan Cruz
sumber
TERIMA KASIH DAN, PERFECTO!
Alec
1

Saya ingin mengabaikan perubahan dalam submodule dan modul saya juga

Perintah di bawah ini membantu saya:

git submodule update --init --recursive
Rajesh Goel
sumber