Git: chỉ liệt kê các tập tin không bị bẻ khóa (cũng như các lệnh tùy chỉnh)


339

Có cách nào để sử dụng một lệnh như git ls-fileschỉ hiển thị các tệp không bị theo dõi không?

Lý do tôi hỏi là vì tôi sử dụng lệnh sau để xử lý tất cả các tệp đã bị xóa:

git ls-files -d | xargs git rm

Tôi muốn một cái gì đó tương tự cho các tập tin chưa được theo dõi:

git some-command --some-options | xargs git add

Tôi đã có thể tìm thấy -otùy chọn này git ls-files, nhưng đây không phải là điều tôi muốn vì nó cũng hiển thị các tệp bị bỏ qua. Tôi cũng đã có thể đưa ra một lệnh dài và xấu xí sau đây:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Có vẻ như phải có một lệnh tốt hơn tôi có thể sử dụng ở đây. Và nếu không có, làm cách nào để tạo các lệnh git tùy chỉnh?


Bạn có thể giải thích tại sao bạn cần git ls-files -d | xargs git rm?
takeshin

Điều đó loại bỏ tất cả các tập tin mà thông báo git bị thiếu. Câu hỏi của tôi là về cách thực hiện một thao tác liên quan - thêm tất cả các tệp mà git hiện không theo dõi. Tôi thường sẽ làm cả hai việc này sau khi đổi tên, kết hợp và / hoặc tách các tệp mã của mình.
Chúng tôi là tất cả Monica

Nếu họ mất tích, vậy thì họ đã bị xóa chưa? Trừ khi ... bạn kéo từ một nơi khác và sau đó bạn đang cố gắng đồng bộ với điều khiển từ xa ... Tôi nghĩ rằng tôi hiểu rồi.
Butussy Butkus

Tôi đã kiểm tra tất cả các câu trả lời, nếu có thư mục trống không bị theo dõi, không ai có thể tìm thấy nó.
kittygirl

@kittygirl cái này đúng. Vì gitchỉ hoạt động trên các tệp, nên nó không có cách theo dõi các thư mục trống. Hãy thử find . -type d -emptythay thế.
Chúng tôi là tất cả Monica

Câu trả lời:


529

Để liệt kê các tệp không bị theo dõi, hãy thử:

git ls-files --others --exclude-standard

Nếu bạn cần dẫn đầu ra xargs, bạn nên nhớ khoảng trắng bằng cách sử dụng git ls-files -zxargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Bí danh đẹp để thêm các tập tin không bị theo dõi:

au = !git add $(git ls-files -o --exclude-standard)

Chỉnh sửa: Để tham khảo: git-ls-files


7
Hoàn hảo! Ý !nghĩa ở đầu dòng bí danh, hoặc tài liệu đó ở đâu?
Chúng tôi là tất cả Monica

@takeshin Làm thế nào để chỉ lấy tên thư mục mẹ? không thư mục con. Có nghĩa là trong các tệp không bị theo dõi này: / P / a / files, / P / a / hình ảnh, / P / a / / P /, ... - Tôi chỉ muốn liệt kê / P /
Dr.jacky 16/07/2016

2
Trong tình huống nào bạn sẽ cần bí danh mặc dù? git add *sẽ làm điều tương tự: thêm tất cả các tệp không bị theo dõi trừ tiêu chuẩn (các tệp mà đường dẫn của chúng được trình bày .gitignore).
toinetoine

1
Tôi thích bí danh của mình hoạt động ổn định trong tất cả các thư mục trong repo (lệnh ls-files chỉ hiển thị các tệp đã thay đổi trong cây hiện tại), vì vậy tôi có[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

Cảm ơn. Nhận xét tốt.
Darth Egregious 16/07/18

71

Nếu bạn chỉ muốn xóa các tệp không bị theo dõi, hãy làm điều này:

git clean -df

thêm xvào đó nếu bạn muốn bao gồm các tập tin bị bỏ qua cụ thể. Tôi sử dụng git clean -dfxmột rất nhiều trong suốt cả ngày.

Bạn có thể tạo git tùy chỉnh bằng cách chỉ cần viết một tập lệnh được gọi git-whatevervà có nó trong đường dẫn của bạn.


Nó phổ biến hơn nhiều khi tôi muốn thêm tất cả các tệp không bị theo dõi (ví dụ: sau khi tôi di chuyển một số thứ). Trong mọi trường hợp, cảm ơn vì lời khuyên về các lệnh tùy chỉnh. Cơ chế đó được ghi nhận ở đâu?
Tất cả chúng ta là Monica

5
Chỉ cần làm git add -Ahoặc git add -u(tùy theo điều đó có ý nghĩa hơn với bạn)
Dustin

1
Nhận xét của bạn là câu trả lời thực sự, cũng được lặp lại sau bởi @Mike Lococo
andho

2
và "git clean -dfxn" để chạy khô bằng cách thêm "n"
charo

50

git add -A -nsẽ làm những gì bạn muốn. -Athêm tất cả các tệp chưa được theo dõi vào repo, -nlàm cho nó trở thành dry-runnơi mà add không được thực hiện nhưng đầu ra trạng thái được đưa ra liệt kê từng tệp sẽ được thêm vào.


7
Đây là một câu trả lời tuyệt vời! Lưu ý rằng nó loại trừ các tệp trong .gitignoretệp, thường là những gì chúng ta muốn, nhưng nếu không , git add -fAn.
cdunn2001

1
Đây dường như là câu trả lời tốt nhất.
Rob Grant

1
Đây là câu trả lời tốt nhất. Nó nói rõ cho người dùng biết họ sẽ làm gì (không cần làm) và tạo cơ hội để xem lại trước khi thực sự thêm nó. Hoàn hảo. Cảm ơn!
Digitguy

Nó cũng liệt kê các tập tin sửa đổi.
Frank-Rene Schäfer

tốt đẹp, nhưng tôi nhận được nó bọc : add '$file'. Trong khi đó git ls-files --exclude-standard -ocho một đầu ra trần, đường ống nóng.
hyperpallium

28

Câu trả lời được chấp nhận gặp sự cố trên tên tập tin với không gian. Tại thời điểm này tôi không chắc chắn cách cập nhật lệnh bí danh, vì vậy tôi sẽ đặt phiên bản cải tiến ở đây:

git ls-files -z -o --exclude-standard | xargs -0 git add

Tôi nghĩ rằng đây là câu trả lời đúng, bởi vì nó cung cấp đường dẫn của mỗi tệp để thực hiện một hành động (như git add) sau đó
Pablo Burgos

27

Mọi thứ rất đơn giản

Để có được danh sách tất cả các tệp không bị theo dõi, hãy sử dụng trạng thái lệnh git với tùy chọn -u (--untracked-files)

git status -u

Làm thế nào về một phiên bản không đệ quy của điều đó?
David

Thật không may, nó cũng liệt kê các tập tin bị bỏ qua .gitignore.
Plouff

8
Đây là câu trả lời duy nhất cho thấy các tệp bị bỏ qua của tôi trên cam kết ban đầu, nhưng tôi đã phải thêm --ignoredvào git status -ulệnh
DN

Điều này là đơn giản và tốt đẹp.
Eric Wang

1
Điều này cũng cho thấy các tập tin sửa đổi. Vì vậy, không phải là một câu trả lời cho câu hỏi: chỉ hiển thị các tập tin chưa được theo dõi.
tự đại diện

6

Khi tìm kiếm các tập tin để có khả năng thêm. Đầu ra từ git showđó nhưng nó cũng bao gồm rất nhiều thứ khác. Lệnh sau rất hữu ích để có cùng danh sách các tệp nhưng không có tất cả các nội dung khác.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Điều này rất hữu ích khi được kết hợp trong một đường ống để tìm các tệp khớp với một mẫu cụ thể và sau đó dẫn đến đó git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

Tôi biết đó là một câu hỏi cũ, nhưng về mặt liệt kê các tệp không bị theo dõi, tôi nghĩ rằng tôi sẽ thêm một câu hỏi khác cũng liệt kê các thư mục chưa được theo dõi:

Bạn có thể sử dụng thao tác git clean với -n (chạy khô) để hiển thị cho bạn tệp nào sẽ xóa (bao gồm các tệp .gitignore) bằng cách:

git clean -xdn

Điều này có lợi thế là hiển thị tất cả các tệptất cả các thư mục không được theo dõi. Thông số:

  • x - Hiển thị tất cả các tệp không bị theo dõi (bao gồm bị bỏ qua bởi git và các tệp khác, như đầu ra bản dựng, v.v.)
  • d - hiển thị các thư mục không bị theo dõi
  • n- và quan trọng nhất! - Dryrun, tức là không thực sự xóa bất cứ thứ gì, chỉ cần sử dụng cơ chế sạch để hiển thị kết quả.

Nó có thể là một chút không an toàn để làm điều đó như thế này trong trường hợp bạn quên -n. Vì vậy, tôi thường bí danh nó trong git config.


2

Tất cả các câu trả lời trước đây mà tôi đã kiểm tra cũng sẽ liệt kê các tệp sẽ được cam kết. Đây là một giải pháp đơn giản và dễ dàng chỉ liệt kê các tệp chưa có trong repo và không phải tuân theo .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

hoặc là

git status --porcelain | grep -v '\?\?'

điều này dường như không hoạt động tốt với các tệp có một khoảng
trắng

-2

Tôi nghĩ điều này sẽ giống với poster ban đầu dự định:

git add .


2
Mỗi khi bạn làm git/svn add ., mèo con chết.
Nakilon

Heh, chỉ khi bạn có một loạt các hành trình trong các bản sao địa phương của các chi nhánh từ xa;) Tạo các chi nhánh địa phương và bạn có thể git add .không bị trừng phạt!
Tim Fulmer

@Nakilon, đó là lý do tại sao bạn cấu hình .gitignoređúng. Vẫn tốt để tránh git add ., mặc dù. Thà git add -u.
tự đại diện
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.