Git: tôi có thể chặn danh sách 'nội dung được sửa đổi' / mục nhập mô hình con bẩn trong trạng thái, diff, v.v. không?


123

Một ngày nào đó (khoảng phiên bản 1.6.x, tôi nghĩ) git đã nhận thức được những thay đổi bên trong các mô hình con. Điều đó chỉ phục vụ làm phiền tôi:

$ git nhà cung cấp trạng thái | grep sửa đổi:
# sửa đổi: nhà cung cấp / đường ray (nội dung sửa đổi)
$ git diff nhà cung cấp /
diff --git a / nhà cung cấp / đường ray b / nhà cung cấp / đường ray
--- a / nhà cung cấp / đường ray
+++ b / nhà cung cấp / đường ray
@@ -1 +1 @@
-Subproject cam kết 046c900df27994d454b7f906caa0e4226bb42b6f
+ Cam kết tiểu dự án 046c900df27994d454b7f906caa0e4226bb42b6f-bẩn

Hãy làm cho nó dừng lại?

Biên tập:

Ok, vậy tôi có một câu trả lời. Bây giờ tôi có một câu hỏi khác:

Tôi có thể đặt cái này vào ~/.gitconfigkhông? Từ ban đầu của tôi, dường như tôi không thể, và tôi đã không thấy bất cứ điều gì hứa hẹn bằng cách lướt qua các bản vá. (Tôi đoán tôi vẫn có thể tạo bí danh.)


Tôi thấy một số bản vá trong danh sách gửi thư git liên quan đến việc này, hẹn hò vào tháng 6 năm 2010. Vì vậy, hy vọng nó sẽ được phát hành trong thời gian tới. (google cho 'git "
--ignore

+1 để giải thích lý do tại sao tin nhắn xảy ra!
dotancohen

Câu trả lời:


175

Thậm chí còn có khả năng đặt chế độ bỏ qua cho mọi mô hình con được thêm vào trong tệp .gitmodules.

Mới hôm nay tôi gặp phải vấn đề này và ngay lập tức viết một bài báo trên blog của mình về nó sau khi tìm ra giải pháp: Làm thế nào để bỏ qua những thay đổi trong mô đun con git

Ý chính của nó:

Khi bạn đã thêm một mô hình con, sẽ có một tệp có tên .gitmodulestrong thư mục gốc của kho lưu trữ của bạn

Chỉ cần thêm một dòng vào .gitmodulestập tin đó :

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1, nhưng tôi đã bao gồm phần chính của bài đăng trên blog của bạn cho câu trả lời của bạn trên SO: liên kết bên ngoài của bạn có thể trở nên không hợp lệ vào một ngày nào đó, trái với câu trả lời SO sẽ tồn tại mãi mãi (thông qua các bãi SO: blog.stackoverflow.com/2009/ 06 /
Lọ

5
Tôi thấy tôi cần phải cam kết tệp .gitmodules trước khi git statuslàm việc như mong đợi. Ngoài ra, bạn cần ít nhất 1.7.4 hoặc tốt hơn tôi tin.
aleemb

Đối với .gitignoretệp, có một phiên bản riêng được gọi exclude, nằm trong .git/info/, không phải là phiên bản được xử lý. Có một tệp tương ứng cho .gitmodulestệp đó, nó sẽ cho phép bạn loại bỏ các thay đổi trong mô hình con chỉ trong thể hiện của kho lưu trữ mẹ mà không thực hiện thay đổi .gitmodules?
HelloGoodbye

2
Tôi không thể làm điều này để làm việc với một mô hình con theo dõi một chi nhánh. Có phải nó không được hỗ trợ cho điều đó? `` `[mô hình con" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... Branch = master ign = bẩn` `` ``
Marc Abramowitz

1
@MarcAbramowitz Tôi đã vấp phải vấn đề tương tự tôi nghĩ - bạn đã tìm thấy giải pháp nào cho vấn đề này chưa?
Sebastian G. Marinescu

61

Có hai loại thông báo thay đổi mà bạn có thể ngăn chặn.

Điều đầu tiên untracked contentxảy ra khi bạn thực hiện các thay đổi cho mô hình con của mình nhưng chưa thực hiện những thay đổi đó. Kho lưu trữ mẹ thông báo những điều này và git statusbáo cáo nó phù hợp:

modified: modules/media (untracked content)

Bạn có thể loại bỏ những thứ này bằng:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

Tuy nhiên, một khi bạn cam kết những thay đổi đó, kho lưu trữ mẹ sẽ một lần nữa chú ý và báo cáo chúng theo đó:

modified:   modules/media (new commits)

Nếu bạn cũng muốn loại bỏ những điều này, bạn cần bỏ qua allnhững thay đổi

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
Đối với .gitignoretệp, có một phiên bản riêng được gọi exclude, nằm trong .git/info/, không phải là phiên bản được xử lý. Có một tệp tương ứng cho .gitmodulestệp đó, nó sẽ cho phép bạn loại bỏ các thay đổi trong mô hình con chỉ trong thể hiện của kho lưu trữ mẹ mà không thực hiện thay đổi .gitmodules?
HelloGoodbye

1
Xin chào, nếu bạn kiểm tra .git / mô-đun / $ MODULENAME / bạn sẽ thấy thư mục .git cho mô-đun đó. Thay đổi thông tin / loại trừ tệp ở vị trí đó thực hiện công việc.
PaulW

1
Phần ignore = allnày là hữu ích.
Eric Wang

53

Cập nhật: Xem (và upvote) câu trả lời của nilshaldenwang về khả năng thêm vào tệp một tham số cấu hình để bỏ qua trạng thái bẩn của một mô hình con đã cho..gitmodules

ignore = dirty

Vì vậy, git 1.7.2 được đưa ra và bao gồm --ignore-submodulestùy chọn cho status.

Từ git help status:

--ignore-mô đun con [= <khi>]
    Bỏ qua các thay đổi cho mô hình con khi tìm kiếm thay đổi.
    <khi> có thể là "không bị theo dõi", "bẩn" hoặc "tất cả", mà
    là mặc định Khi "không theo dõi" được sử dụng các mô hình con
    không được coi là bẩn khi chúng chỉ chứa không bị đóng gói
    nội dung (nhưng chúng vẫn được quét để sửa đổi nội dung).
    Sử dụng "bẩn" bỏ qua mọi thay đổi đối với cây công việc của
    các mô hình con, chỉ thay đổi các cam kết được lưu trữ trong
    siêu dự án được hiển thị (đây là hành vi trước
    1.7.0). Sử dụng "tất cả" ẩn tất cả các thay đổi đối với các mô hình con (và
    triệt tiêu đầu ra của tóm tắt mô hình con khi
    tùy chọn cấu hình status.submodulesummary được đặt).

Giá trị mà tôi muốn là dirty.

git status --ignore-submodules=dirty

Tôi sử dụng bí danh vì tôi lười biếng:

alias gst='git status --ignore-submodules=dirty'

2
Vì đây là câu trả lời được chấp nhận, tôi nghĩ bạn cũng nên thêm tùy chọn thêm ignore=dirtyvào các mục riêng lẻ trong .gitmodulestệp ở đây.
Andriy Drozdyuk

14

Như bạn đã đề cập, mô hình con git patch : bỏ qua các mô hình con bẩn để tóm tắt và trạng thái đang được tạo.

Cũng được công bố trong phiên bản Git 1.7.2-RC2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

Tùy chọn " git status" đã học " --ignore-submodules".

Ý nghĩa:

git config --global diff.ignoreSubmodules dirty

Về điều này như là một tùy chọn không chính xác là cách tiếp cận được chọn bây giờ :

Sau loạt bài này, tôi dự định thêm tùy chọn cấu hình ' ignore' .gitmodules, có thể được đặt cho mỗi mô hình con thành "tất cả", "bẩn", "không bị theo dõi" hoặc "không" (mặc định).

" git diff" và " git status" sẽ sử dụng giá trị cấu hình đó cho mỗi mô hình con.
Sử dụng " --ignore-submodule" ghi đè mặc định này (và tham số mới "none" sẽ được thêm vào đó để có thể ghi đè cài đặt cấu hình).

Và để tránh phải làm " git submdule sync" mỗi khi tùy chọn đó thay đổi, tôi muốn tìm kiếm nó .git/configtrước.
Nếu nó không được tìm thấy ở đó, nó sẽ được lấy từ .gitmodules, nếu có.

Vì vậy, người dùng có thể ghi đè cài đặt nhưng nếu không, ngược dòng có thể thay đổi dễ dàng (ví dụ: khi một mô hình con .gitignoređã được cập nhật để " ignore=untracked" không còn cần thiết nữa thì có thể xóa nó đi).
Ngoài ra, các nhánh chuyển đổi sẽ có hiệu lực ngay lập tức nếu ignoremục nhập '' .gitmoduleskhác nhau giữa các nhánh.


Một cách tiếp cận khác để tạo trạng thái git (hoặc bất kỳ lệnh git nào) để bỏ qua một mô hình con cụ thể có sẵn với Git 2.13 (quý 2 năm 2017):

git config submodule.<name>.active false

Xem thêm tại " Bỏ qua các cam kết mới cho mô hình con git ".


Tôi đã cập nhật câu hỏi với một bit gitconfig. Chỉ cần ping trong trường hợp bạn biết câu trả lời.
kch

@kch: Tôi đã cập nhật câu trả lời với phương pháp hiện đang được đề xuất để lưu trữ loại cài đặt này.
VonC

@drozzy: như bạn đã đề cập trong bình luận khác của mình: " ignore = dirty"
VonC

1
@drozzy: Tôi đã nâng cấp và hoàn thành câu trả lời của nilshaldenwang với tham số cấu hình bổ sung "bỏ qua = bẩn", tôi đã chỉnh sửa câu trả lời chính thức, thêm liên kết đến bài đăng của nilshaldenwang.
VonC

Cảm ơn, không có gì cá nhân, nhưng tôi chỉ muốn câu trả lời hữu ích hơn, mà ban đầu tôi đã bỏ lỡ!
Andriy Drozdyuk

11

Bạn cũng có thể dùng

% git config [--global] submodule.ignore dirty

để thiết lập submodule.ignore = dirtytrong .git/configtập tin của bạn . --globalsẽ đặt cờ bỏ qua trong của bạn ~/.gitconfigvà áp dụng cho tất cả các kho lưu trữ của bạn. Nếu không có nó, bạn nên đặt lại .git/configcho repo hiện tại.

Tài liệu duy nhất tôi có thể tìm thấy về điều này là submodule.<name>.ignoretại các tài liệu git-config . Tôi đã chuyển nó từ tệp .gitmodules sang ~ / .gitconfig và nó vẫn hoạt động với tôi.


@ PawełGościcki Tôi có thể xác nhận nó hoạt động trên Git 2.0.0.
Ciro Santilli 郝海东 冠状 病 事件

6

Bạn cần phải thêm

bỏ qua = bẩn

đến .gitmodules


Bạn thêm nó vào đâu trong .gitmodules?
Andriy Drozdyuk

@drozzy Bạn thêm nó dưới phần cho mỗi mô hình con mà bạn muốn bỏ qua, trong đó các giá trị "đường dẫn" và "url" được xác định.
jsdalton

2

Vì vậy, git v1.7.2-rc2 có những gì tôi muốn:

$ git diff --ignore-Subodules = nhà cung cấp bẩn
# không có đầu ra
$ git status --ignore-Subodules = nhà cung cấp bẩn
# Trên nhánh
không có gì để cam kết (thư mục làm việc sạch sẽ)

Xây dựng git của riêng bạn như thế nào:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html

1
Tôi đếm bảy gits ở đây : git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

Tôi đã trả lời câu hỏi này ở đây chi tiết hơn.

Chỉ cần chạy

git config --global diff.ignoreSubmodules dirty

để thêm tùy chọn cấu hình cục bộ để bỏ qua những thay đổi đó.


1

Bạn có thể không muốn thêm ignore = dirtyvào .gitmodules, bạn có thể muốn chọn lọc hơn về những thay đổi bạn muốn bỏ qua.

Để làm điều đó, thêm các mẫu vào .git/submodule_foo/bar/info/exclude, đâu submodule_foo/bar/là đường dẫn của mô hình con.

Các mẫu tương tự như các mẫu bạn sẽ thêm vào .gitignore, với thư mục gốc là thư mục mô hình con. Chẳng hạn, mẫu này bỏ qua buildthư mục trong mô hình con submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/

3
Tôi nghĩ rằng điều này cũng sẽ che giấu những thay đổi khi bên trong một mô hình con. Tôi chỉ muốn những thay đổi ẩn khi bên ngoài mô hình con. Sẽ ổn nếu chúng xuất hiện khi ở bên trong, khi tôi đang tích cực làm việc với mô hình con.
Raphael Schweikert
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.