2009-10-23 27 views
32

Tôi gặp vấn đề ngược lại từ "How do I make Git ignore file mode (chmod) changes?" Tôi có một tệp mà tôi đã thay đổi quyền thực thi, nhưng cũng có một số thay đổi văn bản và tôi muốn cam kết trước đây nhưng không . Đây có phải là có thể với git không?Làm cách nào để tôi thực hiện thay đổi chế độ chấp nhận git mà không chấp nhận tất cả thay đổi văn bản?

(Trên thực tế, tôi đã thực hiện một số thay đổi văn bản tôi muốn cam kết cùng với thay đổi sự cho phép thực thi, và những người khác tôi không muốn cam kết)

Cập nhật: Unstaging những thay đổi văn bản đến và sau đó thực hiện git add -p một lần nữa và kết hợp một số thay đổi văn bản được quản lý để thay đổi chế độ thành dàn dựng. (Phiên bản git của tôi là 1.5.4.3)

Trả lời

15

git add -i sẽ cho phép bạn chọn lọc thêm một số khối từ tệp vào chỉ mục. Tôi không biết liệu nó có nhạy cảm với các điều khoản hay không, nhưng nếu bạn thêm một đoạn sau hoạt động chmod, nó có thể kết thúc trong chỉ mục một cách chính xác ngay cả khi không cập nhật quyền rõ ràng.

+4

Đó là đúng, git add -i (và git add --patch) yêu cầu bạn "chế độ Stage thay đổi?" ngay trước khi họ hỏi về những người đã thay đổi. – Phil

+0

Cảm ơn Phil. Khả năng đó dường như được liên kết với git 1.5.6 theo ghi chú phát hành. (Thật không may, git của tôi không phải là gần đây) –

74

Bạn sẽ có thể làm:

git update-index --chmod=(+|-)x <file> 

để điều chỉnh các bit thực thi được lưu trữ trong chỉ mục.

Sau đó, bạn có thể cam kết riêng biệt với bất kỳ thay đổi nào đối với nội dung tệp.

+0

** Lưu ý: ** sử dụng "git commit" (với "git add" nếu cần thiết, không phải "git commit -a". Giải pháp này có lợi thế là nó hoạt động ngay cả –

+1

Và nó cũng hoạt động trên các hệ thống tập tin với sự hỗ trợ cho phép kém! Ngay cả Windows! – remram

+0

Giải pháp này là tốt hơn, @Andrew Grimm. Hãy chấp nhận câu trả lời này thay thế, xin vui lòng. – lmaooooo

3

Charles’ answer đã thêm cả thay đổi chế độ tệp và nội dung vào chỉ mục cho tôi. Tôi đã làm việc xung quanh nó như thế này.

git update-index --skip-worktree --chmod=+x <file> 
git update-index --no-skip-worktree <file> 

Example

Hoặc bạn có thể làm

git update-index --chmod=+x <file> 
git config interactive.singlekey 1 
echo na | git reset -p 
Các vấn đề liên quan