git: Làm thế nào để bỏ qua tất cả các tập tin hiện tại không bị theo dõi?


131

Có một cách tiện dụng để bỏ qua tất cả các tệp và thư mục chưa được theo dõi trong kho git?
(Tôi biết về .gitignore.)

Vì vậy, git statussẽ cung cấp một kết quả sạch một lần nữa.



Hoặc bạn có thể muốn thêm một * vào tệp .gitignore của mình. :)
vilicvane

1
Chỉ là một *ý chí rất có thể không phải là những gì bạn muốn.
sjas


Ngạc nhiên trước rất nhiều câu trả lời không chính xác. -u nosai. -unođúng. -u nocố gắng thực hiện một trạng thái trên một tập tin được gọi là no! Các nokhông một cuộc tranh cãi để -u. Để buộc nophải được giải thích như là một đối số -u, không được có khoảng trắng. Để kiểm tra điều này, làm touch Invalidvà so sánh git status -uInvalidvới git status -u Invalid.
Aaron McDaid

Câu trả lời:


251

Như đã nói, để loại trừ khỏi trạng thái chỉ cần sử dụng:

git status -uno  # must be "-uno" , not "-u no"

Thay vào đó, nếu bạn muốn bỏ qua vĩnh viễn các tệp hiện không bị theo dõi, bạn có thể, từ thư mục gốc của dự án, khởi chạy:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Mỗi cuộc gọi tiếp theo git statussẽ bỏ qua những tập tin đó.

CẬP NHẬT : lệnh trên có một nhược điểm nhỏ: nếu bạn chưa có .gitignoretệp nhưng gitignore của bạn sẽ tự bỏ qua! Điều này xảy ra bởi vì tập tin .gitignoređược tạo trước khi git status --porcelainđược thực thi. Vì vậy, nếu bạn chưa có .gitignoretệp nào, tôi khuyên bạn nên sử dụng:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Điều này tạo ra một subshell mà hoàn thành trước khi các .gitignoretập tin được tạo ra.

GIẢI THÍCH QUY TẮC vì tôi đang nhận được rất nhiều phiếu bầu (cảm ơn bạn!) Tôi nghĩ rằng tôi nên giải thích rõ hơn về lệnh này một chút:

  • git status --porcelainđược sử dụng thay git status --shortnhãn hiệu quốc gia "Đưa đầu ra trong một định dạng dễ phân tích cú pháp cho các kịch bản. Đây là giống với sản lượng ngắn, nhưng sẽ duy trì ổn định trên các phiên bản git và bất kể cấu hình người dùng." Vì vậy, chúng tôi có cả khả năng phân tích và ổn định;
  • grep '^??'chỉ lọc các dòng bắt đầu bằng ??, theo hướng dẫn trạng thái git , tương ứng với các tệp không bị theo dõi;
  • cut -c4- xóa 3 ký tự đầu tiên của mỗi dòng, điều này cho chúng ta đường dẫn tương đối đến tệp không bị theo dõi;
  • các |ký hiệu là các đường ống , chuyển đầu ra của lệnh trước sang đầu vào của lệnh sau;
  • các ký hiệu >>>là các toán tử chuyển hướng , nối thêm đầu ra của lệnh trước đó vào một tệp hoặc ghi đè / tạo một tệp mới, tương ứng.

KHÁC NHAU cho những người thích sử dụngsed thay vì grepcut, đây là một cách khác:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- xóa 4 ký tự đầu tiên của mỗi dòng, điều này cho chúng ta đường dẫn tương đối đến tệp không bị theo dõi; Số -cđánh dấu sự bắt đầu của một danh sách các số cột cần cắt. Và 4- chọn dòng từ cột 4 đến cuối, cắt các cột 1-3. Vì vậy, lệnh cắt của bạn thực sự loại bỏ 3 ký tự đầu tiên của mỗi dòng. Nếu bạn xóa 4 ký tự khỏi dòng trạng thái git, chẳng hạn như ký tự cho tệp này tại đây : ?? app/views/static_pages/contact.html.erb, bạn sẽ xóa chữ cái đầu tiên app. Vì vậy, lệnh là chính xác, nhưng giải thích bị lỗi.
7

@ 7stud: cảm ơn bạn, bạn đã đúng, tôi đã viết nhầm 4. Tôi đã sửa câu trả lời.
Diego

2
Tôi thực sự đánh giá cao lời giải thích lệnh. Thật tuyệt khi biết những lệnh ngẫu nhiên mà tôi đã sao chép từ internet đang làm gì và giúp tất cả chúng ta học cách sử dụng dòng lệnh và git tốt hơn.
Eric Lắp

1
-u nokhông làm việc cho tôi. Nhưng -unokhông. Tôi đã cập nhật câu trả lời tương ứng. Đây là thiết kế lạ cho git. Tôi đang ở git 1.7.1
Aaron McDaid

2
@AaronMcDaid: cảm ơn. Sự thay đổi được ghi lại ở đây và được thảo luận ở đây
Diego

51

Nếu bạn muốn bỏ qua vĩnh viễn các tệp này, một cách đơn giản để thêm chúng vào .gitignorelà:

  1. Thay đổi vào gốc của cây git.
  2. git ls-files --others --exclude-standard >> .gitignore

Điều này sẽ liệt kê tất cả các tệp trong các thư mục không bị theo dõi, có thể hoặc không thể là những gì bạn muốn.


3
Tại sao điều này không nhận được nhiều phiếu bầu? Không cần phải thông qua 2 chương trình khác!
JoelFan

4
@JoelFan: hai lý do: 1) lý do này chỉ hoạt động từ thư mục gốc của git , trong khi lý do được chấp nhận hoạt động từ mọi thư mục con, bạn chỉ cần điều chỉnh .gitignoređường dẫn đích 2) nếu bạn có một thư mục không bị theo dõi, danh sách này mỗi danh sách và mỗi tệp duy nhất trong đó, nhưng không phải là thư mục không bị theo dõi (vì vậy bạn sẽ không bỏ qua thư mục, và do đó vẫn nhận được các tệp trong tương lai trong thư mục là không bị theo dõi, trong khi tệp được chấp nhận chỉ liệt kê thư mục chứ không phải các tệp không bị theo dõi bên trong Đây là vấn đề bạn muốn làm, nhưng thường thì bạn chỉ muốn bỏ qua toàn bộ thư mục
Diego

1
Cảm ơn Poolie Tôi đánh giá cao sự khác biệt của đề xuất của bạn những điểm được đề cập bởi @Diego Tôi bắt đầu làm việc với thư viện tệp & thư mục và tôi không muốn theo dõi / đẩy các tệp gốc. Tôi chỉ muốn theo dõi các tập tin tôi thêm hoặc xây dựng lại trong thư viện. Thêm các thư mục cha sẽ bỏ qua mọi thứ. Giải pháp này / của bạn đã thêm tất cả 1696 tệp trong tích tắc. xD
Chaos7703

Điều này cũng có thể đạt được bằng cách sử dụng git config status.showUntrackedFiles no.
larsch

16

Tìm thấy nó trong hướng dẫn

Tham số chế độ được sử dụng để chỉ định xử lý các tệp không bị theo dõi. Nó là tùy chọn: nó mặc định cho tất cả, và nếu được chỉ định, nó phải bị kẹt với tùy chọn (ví dụ: -uno, nhưng không -u no).

git status -uno


39
Chà nếu mọi người sẽ RTFM trước khi đăng bài, không ai trong chúng tôi sẽ nhận được bất kỳ đại diện nào :-)
Jenny D

4

Hai lối:

sử dụng đối số "-uno" để trạng thái git. Đây là một ví dụ:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Hoặc bạn có thể thêm các tệp và chuyển hướng đến .gitignore, trong trường hợp đó chúng sẽ không bao giờ xuất hiện.


2
Một cách tiện dụng để chỉnh sửa bản .gitignorethể git status | cat >> temp && vim temp. Sau đó chỉnh sửa tệp để một vài dòng đầu tiên và dòng cuối cùng bị xóa, cũng như theo dõi #và khoảng trắng sau nó. Sau đó cat temp >> .gitignore && rm temp. Trong trường hợp không có .gitignoremặt trước, mv temp .gitignoresẽ làm. Thứ xấu xí nhưng tốt hơn là cập nhật .gitignorethủ công.
sjas

1
Câu trả lời này không chính xác. Câu trả lời đúng là -uno. Nếu bạn sử dụng -u no, nó tương đương với no -u- nó sẽ thực hiện một trạng thái trên một tệp có tên no(có thể không tồn tại) và sử dụng -uchế độ mặc định . tức là nó tương đương vớigit status no
Aaron McDaid

3

-u nocũng không hiển thị các tập tin chưa được phân loại. -unohoạt động như mong muốn và hiển thị không bị che giấu, nhưng ẩn giấu không bị theo dõi.


1
Ngay cả điều này không hoàn toàn chính xác. git status -u Xtương đương với git status X -u( Xkhông phải là một đối số -u). Điều này, đến lượt nó, tương đương với git status X(vì -ukhông có đối số là mặc định -u). Do đó, nó chỉ đơn giản là một trạng thái git trên tệp X. Vì vậy, nếu Xnonó chỉ đơn giản là cố gắng để làm một status git trên một tập tin gọi là no, mà bạn có lẽ không có
Aaron McDaid

2

Trong trường hợp bạn không dùng Unix như HĐH, thì nó sẽ hoạt động trên Windows bằng PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Tuy nhiên, .gitignoretập tin phải có một dòng trống mới, nếu không nó sẽ nối văn bản vào dòng cuối cùng bất kể nó có nội dung hay không.

Đây có thể là một sự thay thế tốt hơn:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

Nếu bạn có nhiều tệp không bị theo dõi và không muốn " gitignore" tất cả chúng, hãy lưu ý rằng, kể từ git 1.8.3 (tháng 4, 22d 2013) , git statussẽ đề cập đến --untracked-files=nongay cả khi bạn không thêm tùy chọn đó vào địa điểm đầu tiên!

" git status" đề nghị người dùng xem xét sử dụng --untracked=notùy chọn khi mất quá nhiều thời gian.


0

Tôi đến đây cố gắng giải quyết một vấn đề hơi khác. Có lẽ điều này sẽ hữu ích cho người khác:

Tôi tạo một chi nhánh mới feature-a. Là một phần của nhánh này, tôi tạo các thư mục mới và cần sửa đổi .gitignore để loại bỏ một số trong số chúng. Điều này xảy ra rất nhiều khi thêm các công cụ mới vào một dự án tạo các thư mục bộ đệm khác nhau. .serverless, .terraformv.v.

Trước khi tôi sẵn sàng hợp nhất trở lại thành chủ, tôi có một thứ khác xuất hiện, vì vậy tôi kiểm tra masterlại, nhưng bây giờ git statuschọn lại các thư mục bị chặn đó, vì .gitignore chưa được hợp nhất.

Câu trả lời ở đây thực sự đơn giản, mặc dù tôi đã phải tìm blog này để tìm ra nó:

Chỉ cần kiểm tra tệp .gitignore từ feature-achi nhánh

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
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.