2010-11-19 27 views
7

Tôi muốn chạyGIT: Tôi muốn unstage tất cả các file phù hợp với một khuôn mẫu nhất định

git reset *.foo 

nhưng lỗi này ra.

Tôi nghĩ rằng tôi cần phải sử dụng một đường ống, nhưng tôi không chắc chắn làm thế nào để làm điều này.

Cảm ơn!

+0

Lưu ý: các tệp này đã được phân đoạn là đã xóa. tức là các tệp không còn trong thư mục làm việc của tôi nữa. Vì vậy, tôi đoán tôi cần một cái gì đó như git checkout * .foo – Jacko

Trả lời

7
for i in `git status --porcelain | grep '^D.*\.foo$' | sed 's/^D \+//'`; do 
    git reset HEAD "$i" 
    git checkout "$i" 
done 
+0

Cảm ơn. Bây giờ, thay đổi theo giai đoạn là xóa các tệp này. vì vậy, điều này sẽ vẫn hoạt động? tệp thực sự đã bị xóa trong thư mục – Jacko

+0

Không, điều đó sẽ không hoạt động. Tôi sẽ cập nhật câu trả lời của mình bằng một lệnh mới. – cdhowie

+0

Đã cập nhật câu trả lời. – cdhowie

6

Nếu bạn đang sử dụng Powershell, tính năng sau sẽ hoạt động.

gci -re -in *foo | %{ git reset $_ } 
2

Trong một ứng dụng Git GUI như SmartGit tôi sẽ lọc các tập tin hiển thị bằng mô hình *.foo, nhấn Ctrl + A để chọn tất cả các file được lọc và gọi lệnh Unstage.

2

này nên làm việc trong Cygwin và unix env

git reset $(git diff --name-only --cached | grep *.foo) 
1

Ví dụ: Tôi muốn khớp tất cả "di chuyển" trong đường dẫn.

git diff --name-only | di chuyển grep | git checkout xargs

0

Nếu bạn muốn thanh toán (undo thay đổi) của unstaged tập tin sửa đổi phù hợp với một mô hình nào đó, công trình này:

MacOS:

git checkout $(git st -s | sed -E 's/^.{2}//' | grep '\.foo$') 

Unix:

git checkout $(git st -s | sed -r 's/^.{2}//' | grep '\.foo$') 

Tôi chỉ thử nghiệm điều này với M tệp đã sửa đổi. YMMV nếu bạn đã đổi tên/xóa/xung đột tệp.

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