2015-01-22 23 views
5

Như câu hỏi, nếu tôi muốn hủy thay đổi trong thư mục làm việc, tôi chạy lệnh git checkout -- * nhưng git trả về thông tin error: pathspec 'databaseName.tmp' did not match any file(s) known to git.. Tôi không git chủ và tôi không biết làm thế nào để giải quyết nó. Bất kỳ ý tưởng?Lỗi "git checkout - *" returns ": pathspec không khớp với bất kỳ tệp nào được biết đến git"

+0

bạn có bất kỳ tệp nào không được theo dõi trong thư mục làm việc của mình không? – genisage

+0

Vâng, tôi có một số. – pepuch

+1

Đó là vấn đề của bạn, bạn không thể kiểm tra một tập tin không được theo dõi từ chỉ mục. Vì vậy, thay vì chỉ một '*' bạn cần liệt kê chỉ những tập tin bạn thực sự muốn kiểm tra. – genisage

Trả lời

15

Như genisagenoted in a comment, bạn đang yêu cầu git rõ ràng để kiểm tra các tập tin databaseName.tmp, như thể bạn đã gõ vào:

git checkout -- databaseName.tmp 

Điều này là do * bạn gõ vào được xử lý bởi vỏ, trước khi git có cơ hội nhìn thấy lệnh của bạn. Shell thay thế * bằng tất cả tên tệp trong thư mục làm việc hiện tại của bạn, và sau đó thực hiện điều đó, rồi chạy git, mà không có bất kỳ dấu hiệu nào cho thấy lệnh thực tế bạn nhập có * trong đó chứ không phải tất cả các tên đó.

Một lần nữa, git không có ý tưởng mà bạn sử dụng dấu hoa thị * nhân vật, tất cả những gì nhìn thấy là một danh sách tên tập tin, bao gồm bất kỳ cấp cao nhất các file bỏ qua được không được lưu trữ trong git.

gây nhầm lẫn, nếu bạn quản lý bằng cách nào đó để vượt qua một dấu đen * git, git sẽ mở rộng *, nhưng với một bộ khác nhau của tên file: những được biết đến với git. Điều đó sẽ làm những gì bạn muốn.

Có một cách dễ dàng hơn, mặc dù: git sẽ kiểm tra thư mục một cách đệ quy bằng cách kiểm tra tất cả các tệp mà nó biết về trong thư mục đó. Vì vậy, thay vì sử dụng *, chỉ cần sử dụng . hỏi git để kiểm tra thư mục hiện hành:

git checkout -- . 

Nếu git biết về ./a./b nhưng không ./databaseName.tmp, điều này sẽ kiểm tra ./a./b và không cố gắng làm bất cứ điều gì với ./databaseName.tmp.


Chính xác hơn, các file có tên không bắt đầu với một dấu chấm hàng đầu ..

Và trên thực tế, nó khá dễ dàng để quản lý, ví dụ, chỉ cần chèn một dấu gạch chéo \ ở phía trước của dấu: git checkout -- \*. Hoặc, sử dụng dấu nháy đơn hoặc kép, cả hai đều bảo vệ chống lại sự bao phủ của vỏ. Dấu nháy đơn cũng ức chế sự mở rộng biến của vỏ, trong khi dấu ngoặc kép cho phép mở rộng biến đổi nhưng ức chế sự kết hợp.

Đó là giá trị chỉ ra một sự khác biệt tinh tế ở đây: * mở rộng để tên mà không bắt đầu với . nộp, trong khi yêu cầu git để kiểm tra . gây ra nó để kiểm tra tất cả các file trong thư mục, bao gồm những có tên bắt đầu bằng ..Do đó, cả git checkout -- \*git checkout -- * sẽ không không hoàn tác thay đổi đối với tệp có tên .secret, trong khi git checkout -- .sẽ hoàn tác các thay đổi đó.

+0

Chỉ muốn lưu ý rằng nó cũng hoạt động với đường dẫn. Nếu bạn ở trong thư mục gốc của repo, bạn có thể thực hiện 'git checkout - path/to/files/.' để hoàn nguyên tất cả các tệp trong thư mục đó. – BrianVPS

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