2014-09-25 19 views
65

Tôi mới tham gia git và tôi có câu hỏi về cách thêm tệp vào git. Tôi đã tìm thấy nhiều câu hỏi về lưu lượng truy cập stackover về sự khác biệt giữa git add .git add -a, git add --all, git add -A, v.v ... Nhưng tôi đã không thể tìm thấy một địa điểm giải thích những gì git add * làm. Tôi thậm chí đã nhìn vào số git add man page, nhưng nó không giúp được gì. Tôi đã sử dụng nó thay cho git add . và đồng nghiệp của tôi đã hỏi tôi tại sao. Tôi không có câu trả lời. Tôi đã luôn luôn sử dụng git add *.git add * (dấu hoa thị) vs git add. (giai đoạn)

Có phải git add .git add * giống nhau không? Có phải chỉ thêm một tệp đã thay đổi từ thư mục hiện tại, trong khi tệp kia thêm tệp từ thư mục hiện tại và thư mục con (đệ quy)?

Có một biểu đồ tuyệt vời được liệt kê trên một trong các câu hỏi ngăn xếp khác cho thấy sự khác biệt giữa git add -Agit add .git add -u, nhưng không có git add *.

enter image description here

Lưu ý: Tôi hiểu ý nghĩa của việc sử dụng dấu hoa thị như một ký tự đại diện (thêm tất cả các file có phần mở rộng nhất định). Ví dụ: git add *.html sẽ thêm tất cả các tệp có tiện ích mở rộng .html (nhưng bỏ qua .css, .js, v.v ...).

Cảm ơn sự giúp đỡ!

+1

Biểu đồ đó từ đâu? Tôi vừa thử 'git add .' lần nữa, và nó đã dàn dựng một tập tin bị xóa không có vấn đề, không giống như' X' trong hàng đó sẽ gợi ý. – David

+0

@David Hình ảnh đó là từ [câu trả lời này] (http://stackoverflow.com/a/26039014/1270168) và áp dụng cho các phiên bản cũ hơn của git. – jerry

+2

Ảnh đã lỗi thời! Git 2.x khác nhau: https://i.stack.imgur.com/KwOLu.jpg –

Trả lời

63

add * nghĩa là thêm tất cả các tệp trong thư mục hiện tại, ngoại trừ các tệp có tên bắt đầu bằng dấu chấm. Đây là chức năng vỏ của bạn và Git chỉ nhận được một danh sách các tập tin.

add . không có ý nghĩa đặc biệt trong vỏ của bạn, và do đó Git thêm toàn bộ thư mục đệ quy, gần như giống nhau, nhưng bao gồm các tệp có tên bắt đầu bằng dấu chấm.

+3

vì vậy 'git add .' thêm tất cả các tệp, thư mục và thư mục con, bao gồm .gitignore và bất kỳ thứ gì khác bắt đầu bằng dấu chấm, trong khi' git add * 'sẽ thêm bất kỳ tệp, thư mục và thư mục con nào, ngoại trừ những tệp bắt đầu bằng dấu chấm? Điều đó có chính xác không? – Tyler

+5

Điều đó thực sự đúng. Ngoài ra, 'git add *' sẽ vẫn thêm tệp bắt đầu bằng dấu chấm nếu chúng nằm trong thư mục phụ. – Denis

+1

'git add .' cũng tôn trọng .gitignore, trong khi' git add * 'sẽ ném một lỗi nếu bất kỳ tệp không phải dấu chấm nào được gitignored. Sử dụng 'git add'' tốt hơn' git add * '. – rosuav

12

* không phải là một phần của git - đó là một ký tự đại diện được diễn giải bởi trình bao. * mở rộng cho tất cả các tệp trong thư mục hiện tại và chỉ sau đó được chuyển đến git, tất cả đều là add. . là thư mục hiện tại và git add nhập nó sẽ thêm nó và tất cả các tệp trong đó.

+0

Vì vậy, sẽ có mọi lý do để sử dụng dấu sao? Có lợi thế nào khi sử dụng nó thay vì một khoảng thời gian không? Hoặc ngược lại? Tôi chắc rằng tôi đã thấy nó trong một hướng dẫn. Tôi sẽ không biết sử dụng nó theo cách khác. Tôi không phải là một anh chàng dòng lệnh (như bạn chắc chắn đã đoán). – Tyler

+2

'*' tránh các tệp bị ẩn (tức là các tệp mà tên của chúng bắt đầu bằng '.'). Trong mọi trường hợp, nếu bạn không thêm các tệp cụ thể, tôi chỉ sử dụng 'git add -u' (hoặc' git add -A' nếu bạn đang tạo tệp mới). – Mureinik

+0

Vì cả hai bạn đã trả lời câu hỏi của tôi, tôi đã gặp khó khăn khi quyết định ai sẽ cho tín dụng. Tôi đã chọn Denis dưới đây bởi vì anh ta có ít đại diện hơn bạn. Vì vậy, tôi đã cho anh ta kiểm tra màu xanh lá cây sẽ mang lại lợi ích cho anh ta nhiều hơn nó sẽ có lợi cho bạn. Tôi hy vọng điều đó đúng? Nhưng tôi thực sự đánh giá cao cả hai lời giải thích. Cảm ơn! – Tyler

4

Sử dụng dấu chấm . trong vỏ thường có nghĩa là "thư mục hiện tại".

Khi bạn sử dụng dấu hoa thị * trên vỏ, một tính năng được gọi là file-globbing được sử dụng. Ví dụ. trên bash chức năng glob() đang làm điều đó.Manpage cho glob (man 7 glob) khẳng định:

MÔ TẢ

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns. Soon afterward this became a shell built-in. 
These days there is also a library routine glob(3) that will perform this 
function for a user program. 

Wildcard phù hợp với

A string is a wildcard pattern if it contains one of the characters '?', '*' or '['. 

globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern. 

Điều đó có nghĩa khi bạn vượt qua các đối số cho bất kỳ chương trình trên dòng lệnh có chứa '?', '*' hay '[', globbing đầu tiên mở rộng mô hình ký tự đại diện vào một danh sách các tập tin và sau đó cung cấp cho những tập tin này như một tham số cho chương trình riêng của mình.

Sự khác biệt về ý nghĩa giữa 'git add .''git add *' được mô tả rõ ràng bởi Denis:

git add hy vọng một danh sách các tập tin được thêm vào. Trong ví dụ trên, vỏ mở rộng tương ứng * hoặc . và cho kết quả dưới dạng tham số để thêm git. Bây giờ sự khác biệt là với git add . git sẽ mở rộng đến thư mục hiện tại trong khi git add * kích hoạt tính năng giải nén tệp và mở rộng như vậy cho tất cả các tệp và thư mục không bắt đầu bằng dấu chấm.

Các vấn đề liên quan