Git diff nói tiểu dự án là bẩn


227

Tôi vừa chạy một git diff và tôi nhận được đầu ra sau cho tất cả 10 mô hình con của tôi

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

Điều đó có nghĩa là gì? Làm thế nào để tôi sửa chữa nó?

Câu trả lời:


268

Như đã đề cập trong bài viết trên blog của Mark Longair Git Submodules Giải thích ,

Phiên bản 1.7.0 trở lên của git chứa một thay đổi khó chịu trong hành vi của mô hình con git.
Các mô hình con bây giờ được coi là bẩn nếu chúng có bất kỳ tệp sửa đổi hoặc các tệp không bị theo dõi nào , trong khi trước đó nó chỉ là trường hợp nếu CHÍNH trong mô hình con trỏ chỉ ra cam kết sai.

Ý nghĩa của dấu cộng ( +) trong đầu ra của mô hình con git đã thay đổi và lần đầu tiên bạn bắt gặp điều này, phải mất một chút thời gian để tìm ra điều gì sai, ví dụ bằng cách xem qua các thay đổi hoặc sử dụng git bisect trên git .git để tìm sự thay đổi. Người dùng sẽ vui lòng giới thiệu một biểu tượng khác cho phiên bản được chỉ định, nhưng bẩn bẩn.

Bạn có thể sửa nó bằng cách:

  • hoặc cam kết hoặc hoàn tác các thay đổi / diễn biến trong mỗi mô hình con của bạn, trước khi quay lại repo gốc (nơi diff không báo cáo các tệp "bẩn" nữa). Để hoàn tác tất cả các thay đổi đối với mô hình con của bạn chỉ cần cdvào thư mục gốc của mô hình con của bạn và làmgit checkout .

    Nhận xét dotnetCarpenter mà bạn có thể thực hiện:git submodule foreach --recursive git checkout .

  • hoặc thêm --ignore-submodulesvào của bạn git diff, để tạm thời bỏ qua các mô hình con "bẩn".

Mới trong phiên bản Git 1.7.2

Như Noam bình luận bên dưới , câu hỏi này đề cập rằng, kể từ phiên bản git 1.7.2, bạn có thể bỏ qua các mô hình con bẩn với:

git status --ignore-submodules=dirty

2
Ngoài ra một điều tốt để biết: bạn vẫn có thể thực hiện git commit -amà không phải lo lắng thêm các thay đổi này. Mặc dù chúng được đánh dấu Mở phía trước, nhưng chúng sẽ không kết thúc trong cam kết của bạn.
gitaarik

1
Đối với tôi, tôi đã phải đi vào từng mô hình con bẩn thỉu và chạy git clean -id.
GDP2

1
@ GDP2 Mà bạn có thể quyên góp trong một dòng, với git submodule foreach --recursive git clean -id(sẽ được kiểm tra trong bản sao lưu dự phòng trước;))
VonC

1
Trường hợp tôi tiếp tục nhìn thấy điều này không thể giải thích được, điều đang xảy ra là tôi đã có các tệp không được theo dõi mà không có trong mô hình con .gitignore. Thêm chúng ở đó hoặc vào danh sách bỏ qua toàn cầu của tôi những điều cố định.
Ben

21

Cũng loại bỏ các mô hình con và sau đó chạy git submodule initgit submodule updaterõ ràng sẽ thực hiện các mẹo, nhưng có thể không phải lúc nào cũng phù hợp hoặc có thể.


1
Điều này làm việc cho tôi khi tôi chuyển đổi một số thư mục hiện có thành các mô hình con và sau đó kéo sang một máy khác vẫn còn các thư mục cũ.
Roger Lipscombe

18

Để bỏ qua tất cả các tệp không bị theo dõi trong bất kỳ mô hình con nào, hãy sử dụng lệnh sau để bỏ qua những thay đổi đó.

git config --global diff.ignoreSubmodules dirty

Nó sẽ thêm tùy chọn cấu hình sau vào cấu hình git cục bộ của bạn:

[diff]
  ignoreSubmodules = dirty

Thông tin chi tiết có thể được tìm thấy ở đây


16

EDIT : Câu trả lời này (và hầu hết các câu hỏi khác) đã lỗi thời; thay vào đó hãy xem câu trả lời của Devpool .


Ban đầu, không có tùy chọn cấu hình để tạo " git diff --ignore-submodules" và " git status --ignore-submodules" mặc định toàn cục (nhưng cũng xem Đặt cờ git mặc định trên các lệnh ). Một cách khác là đặt ignoretùy chọn cấu hình mặc định cho từng mô hình con riêng lẻ mà bạn muốn bỏ qua (cho cả hai git diffgit status), trong .git/configtệp (chỉ cục bộ) hoặc .gitmodules(sẽ được git phiên bản). Ví dụ:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untrackedđể bỏ qua các tệp chưa được theo dõi, ignore = dirtycũng bỏ qua các tệp đã sửa đổi và ignore = allbỏ qua các cam kết. Dường như không có cách nào để ký tự đại diện cho tất cả các mô hình con.


13

Đây là trường hợp bởi vì con trỏ bạn có cho mô hình con không phải là những gì thực sự có trong thư mục mô hình con. Để khắc phục điều này, bạn phải chạy git submodule updatelại:


9
git submodule foreach --recursive git checkout .

Điều này không phải là một mẹo nhỏ đối với tôi nhưng nó đã cho tôi một danh sách các tệp (trong trường hợp của tôi chỉ có một) đã được thay đổi trong mô hình con (không có tôi làm bất cứ điều gì ở đó).

Vì vậy, tôi có thể chuyển sang trạng thái mô đun con và git cho tôi thấy rằng ĐẦU của tôi đã bị tách ra -> git checkout master, git status để xem tệp đã sửa đổi một lần nữa, git checkout> tên tệp <, git pull và mọi thứ lại ổn.


9

Tôi đã kết thúc việc loại bỏ thư mục mô hình con và khởi tạo lại nó một lần nữa

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
Tôi thà hiểu chuyện gì đã xảy ra, nhưng đây cũng là điều duy nhất có tác dụng với tôi ...
smilebomb

6

Một mô hình con có thể được đánh dấu là bẩn nếu cài đặt tên tệp được bật và bạn đã thay đổi quyền truy cập tệp trong cây con mô đun con.

Để vô hiệu hóa tên tệp trong mô hình con, bạn có thể chỉnh sửa /.git/modules/path/to/your/submodule/config và thêm

[core]
  filemode = false

Nếu bạn muốn bỏ qua tất cả các trạng thái bẩn, bạn có thể đặt ignore = dirtythuộc tính trong tệp /.gitmodules , nhưng tôi nghĩ tốt hơn là chỉ vô hiệu hóa tên tệp.


1

Trong trường hợp của tôi, tôi không chắc điều gì đã gây ra điều này xảy ra, nhưng tôi biết tôi chỉ muốn các mô hình con được đặt lại thành cam kết từ xa mới nhất của chúng và được thực hiện với nó. Điều này liên quan đến việc kết hợp câu trả lời từ một vài câu hỏi khác nhau ở đây:

git submodule update --recursive --remote --init

Nguồn:

Làm cách nào để hoàn nguyên các thay đổi của tôi thành mô hình con git?

Cách dễ dàng để kéo mới nhất của tất cả các mô đun con git

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.