Subodule Git hiển thị các xác nhận mới, trạng thái mô hình con nói không có gì để cam kết


47

Trong kho git, tôi đã thiết lập tệp .gitmodules của mình để tham chiếu kho lưu trữ github:

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

Khi tôi 'git status' trên repo này, nó hiển thị:

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)

Nếu tôi cd vào trạng thái src / repo và git trên repo, nó nói rằng không có gì để cam kết.

Tại sao repo git cấp cao nhất của tôi phàn nàn?

Câu trả lời:


42

Đó là vì Git ghi lại cam kết (không phải là chi nhánh hoặc thẻ, chính xác một cam kết được thể hiện trong hàm băm SHA-1) nên được kiểm tra cho mỗi mô hình con. Nếu bạn thay đổi một cái gì đó trong thư mục con, Git sẽ phát hiện ra nó và thúc giục bạn thực hiện những thay đổi đó trong giới thượng lưu cấp cao nhất.

Chạy git difftrong kho lưu trữ cấp cao nhất để hiển thị những gì thực sự đã thay đổi Git nghĩ. Nếu bạn đã thực hiện một số cam kết trong mô hình con của mình (do đó "sạch" trong mô hình con), nó sẽ báo cáo thay đổi băm của mô hình con.

$ 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

Mặt khác, nó hiển thị -dirtythay đổi băm mà bạn không thể tạo giai đoạn hoặc cam kết trong kho lưu trữ cấp cao nhất. git statuscũng tuyên bố mô hình con có nội dung không bị theo dõi / sửa đổi.

$ 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")

Để cập nhật những bản ghi cam kết nào cần được kiểm tra cho mô hình con, bạn cần git commit mô hình con bên cạnh việc thực hiện các thay đổi trong mô hình con:

git add src/repo

1
Điều gì xảy ra nếu tôi không muốn thêm bất kỳ cam kết nào trong repo chính? Trường hợp sử dụng của tôi là - Tôi có một kho lưu trữ chính, sau đó tôi có wiki của nó cũng là một kho lưu trữ (như có sẵn trong GitHub và Bitbucket). Bây giờ tôi đã thêm wikimột mô hình con trong thư mục wiki . Tôi không muốn bất kỳ thay đổi nào của tôi từ wiki(tức là thư mục wiki ) phản ánh trong kho lưu trữ chính / mã của tôi. Tôi có nên thêm .gitmodules đường dẫn trong .gitignorekho chính của mình không? Làm thế nào tôi nên đi về nó?
yadav_vi

14
Trong trường hợp của tôi, tất cả những gì tôi cần làm là cập nhật chính mô hình con từ repo chính. Một cái gì đó như:git submodule update src/repo
Agustín Amenabar

19

Tôi vừa gặp phải loại vấn đề tương tự này và tôi đã có thể sử dụng giải pháp được cung cấp bởi @AugustinAmenabar trong phần bình luận của câu trả lời được chấp nhận. Thiết lập của tôi phức tạp hơn một chút, vì vậy tôi đã thêm --recursivecờ để cập nhật tất cả các phụ thuộc.

git submodule update src/repo --recursive

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.