Git submodule menunjukkan komit baru, status submodule tidak mengatakan apa pun untuk dikomit

47

Dalam repositori git, saya telah mengatur file .gitmodules saya untuk referensi repositori github:

[submodule "src/repo"]
    path = src/repo
    url = repourl

ketika saya 'status git' pada repo ini, itu menunjukkan:

On branch master
Your branch is up-to-date with 'origin/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:   src/repo (new commits)

Jika saya cd ke src / repo dan status git pada repo, ia mengatakan bahwa tidak ada yang harus dikomit.

Mengapa git repo tingkat atas saya mengeluh?

Catherine Holloway
sumber

Jawaban:

42

Itu karena catatan Git yang melakukan (bukan cabang atau tag, tepat satu komit diwakili dalam hash SHA-1) harus diperiksa untuk setiap submodule. Jika Anda mengubah sesuatu dalam direktori submodule, Git akan mendeteksinya dan mendesak Anda untuk melakukan perubahan tersebut di repoisitory level atas.

Jalankan git diffdi repositori tingkat atas untuk menunjukkan apa yang sebenarnya berubah menurut Git. Jika Anda sudah membuat beberapa komitmen dalam submodule Anda (dengan demikian "bersih" dalam submodule), itu melaporkan perubahan hash submodule.

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

Kalau tidak, ini menunjukkan -dirtyperubahan hash yang Anda tidak bisa panggung atau komit di repositori tingkat atas. git statusjuga mengklaim submodule memiliki konten yang tidak terlacak / dimodifikasi.

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ 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)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

Untuk memperbarui catatan komit mana yang harus diperiksa untuk submodule, Anda perlu mendapatkan komit submodule sebagai tambahan untuk melakukan perubahan pada submodule:

git add src/repo
yaegashi
sumber
1
Bagaimana jika saya tidak ingin menambahkan komit di repo utama? Kasus penggunaan saya adalah - Saya memiliki repositori utama, kemudian saya memiliki wiki yang juga merupakan repositori (seperti yang tersedia di GitHub dan Bitbucket). Sekarang saya telah menambahkan wikisebagai submodule di direktori wiki . Saya tidak ingin ada perubahan saya dari wiki(yaitu direktori wiki ) untuk tercermin dalam repositori utama / kode saya. Haruskah saya menambahkan .gitmodules path di .gitignorerepositori utama saya? Bagaimana saya harus melakukannya?
yadav_vi
14
Dalam kasus saya yang perlu saya lakukan hanyalah memperbarui submodule itu sendiri dari repo utama. Sesuatu seperti:git submodule update src/repo
Agustín Amenabar
19

Saya hanya mengalami masalah yang sama, dan saya dapat menggunakan solusi yang ditawarkan oleh @AugustinAmenabar di bagian komentar dari jawaban yang diterima. Pengaturan saya sedikit lebih rumit, jadi saya menambahkan --recursivetanda untuk memperbarui semua dependensi.

git submodule update src/repo --recursive

Zak
sumber