git update-index - số lượng-không thay đổi trên thư mục


101

git 1.7.12

Tôi muốn đánh dấu tất cả các tệp bên dưới một thư mục nhất định là giả định không thay đổi.

1) git update-index --assume-unchaged dir/đưa ra "Đường dẫn bỏ qua".

2) git update-index --assume-unchaged dir/*nhanh chóng không thành công vì nó sẽ gặp phải các tệp không được theo dõi, do đó nó cho "nghiêm trọng: Không thể đánh dấu tệp" và thoát.

3) Thử tạo danh sách các tệp để đánh dấu. cdvào thư mục mong muốn và sau đó chạy git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Điều này không tạo ra thông báo lỗi, nhưng nó không đánh dấu thành công các tệp. Phần đầu tiên của lệnh, git ls-files | tr '\n' ' 'chính xác tạo ra một danh sách được phân cách bằng dấu cách gồm tất cả các tệp tôi muốn đánh dấu. Nếu tôi sao chép và dán đầu ra của lệnh đó vào dòng lệnh, thì git update-indexlệnh sẽ hoạt động. Điều gì không hoạt động với các đường ống?

Không, tôi thêm dirvào .gitignore là không đủ . Tôi cần những tệp này ở trong kho lưu trữ, nhưng những thay đổi không mong muốn sẽ được thực hiện cục bộ cần được bỏ qua để người dùng có thể thực hiện kéo.

Câu trả lời:


173

git update-index muốn tên tệp trên dòng lệnh của nó, không phải trên đầu vào chuẩn của nó.

Bước 1:

cd vào thư mục bạn muốn giả sử là không thay đổi

Bước 2:

Bạn có thể làm điều này:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

hoặc là

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Mặc dù, với cả hai trường hợp, tên tệp có khoảng trắng sẽ có vấn đề. Nếu bạn có những thứ đó, bạn có thể sử dụng cái này:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Chỉnh sửa: kết hợp đầu vào từ @MatthewScharley liên quan đến git ls-files -z.

Lệnh Windows

Lưu ý: Nếu bạn đang sử dụng windows, hãy sử dụng Git Bash để chạy các lệnh này


2
FYI, rằng `| tr '\ n' '' 'bit là không cần thiết.
Václav Slavík

7
@twalberg: Bạn chỉ có thể sử dụnggit ls-files -z
Matthew Scharley

2
@twalberg Cách hoàn tác lệnh này "git ls-files -z | xargs -0 git update-index --assume-Without"
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, tôi sẽ nghĩ ...
twalberg

1
git ls-files -z | git update-index -z --stdinsạch hơn.
Jed

22

Các findlệnh từ GNU findutils có một -exectùy chọn mà loại bỏ hầu hết các rắc rối của việc sử dụng xargs, mặc dù cú pháp của nó là một chút đặc biệt. Tuy nhiên, nó xử lý hoàn hảo với các tên tệp có khoảng trắng.

Lệnh này sẽ nhận git để giả sử tất cả các tệp trong và dưới thư mục được liệt kê là không thay đổi:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Tìm lấy mọi đối số sau đó -execcho đến khi ;(bạn phải thoát khỏi nó để tránh trình bao của bạn ăn nó) và chạy nó một lần cho mỗi tệp được tìm thấy, đồng thời thay thế {}(một lần nữa, trích dẫn duy nhất để trình bao của bạn không ăn nó) bằng tên của tệp tìm thấy.

Sử dụng findtiêu chí đối sánh của (độ sâu đệ quy tối đa, đối sánh là tệp hay là thư mục, tên tệp có khớp với một biểu thức hay không) và -execbạn có thể thực hiện tất cả những việc hiệu quả.

Không chắc chắn về các triển khai khác của findlệnh. YMMV.


2
-execlà một tùy chọn tiêu chuẩn . Bạn cũng có thể -exec git update-index --assume-unchanged {} +(cũng được định nghĩa theo tiêu chuẩn) chuyển nhiều tên tệp cho lệnh cùng một lúc, giảm số lần lệnh git được gọi.
Tom Fenech

16

Thêm tên thư mục vào .git/info/exclude. Điều này hoạt động đối với các tệp không được theo dõi.


Công việc này tuyệt vời! Bạn có biết nếu điều này cũng hoạt động với các tệp?
betomoretti

Nhưng điều này không đẩy các tệp chưa được kiểm tra github! Có cách nào khả thi để bỏ qua chúng khỏi hồ sơ nhưng thực sự giữ chúng trong repo không !?
Mahmoud Zalt

2

Yeap,

git update-index --assume-unchanged

chỉ hoạt động với tệp, không phải với thư mục. Tôi nghĩ, một trong những cách nhanh hơn:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
Thay vì sử dụng cd, bạn có thể vượt qua dir như một cuộc tranh luận cuối cùng: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh
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.