2009-08-10 26 views
500

Vì lý do nào đó, khi tôi thực hiện một lần kéo từ kho lưu trữ cho một dự án git của tôi, Tôi nhận được rất nhiều tập tin trong bản sao làm việc của mình mà không có thay đổi rõ ràng nào được thực hiện cho họ, nhưng vẫn hiển thị trong khu vực unstaged changes của tôi .Làm cách nào để xóa các tệp có tên "chế độ cũ 100755 chế độ mới 100644" khỏi các thay đổi chưa được chỉnh sửa trong Git?

Tôi đang sử dụng Git Gui trên Windows xp và khi tôi đi xem tệp để xem điều gì đã thay đổi. Tất cả những gì tôi thấy là:

old mode 100755 
new mode 100644 

Có ai biết điều này có nghĩa là gì không?

Làm cách nào để có được các tệp này trong danh sách các thay đổi không được tổ chức? (Rất khó chịu khi phải trải qua 100 tệp, chỉ cần chọn các tệp tôi vừa mới chỉnh sửa và muốn cam kết).

Trả lời

850

Trông giống như unix chế độ cấp phép tập tin với tôi (755 = rwxr-xr-x, 644 = rw-r--r--) - chế độ cũ bao gồm + x (thực thi) cờ, chế độ mới thì không.

This msysgit issue's replies gợi ý thiết core.filemode false để thoát khỏi vấn đề này:

git config core.filemode false 
+95

+1. Điều này có nghĩa là git nghĩ rằng nó có thể thiết lập chính xác bit thực thi trên các tệp đã kiểm xuất, nhưng khi nó cố gắng làm như vậy nó không hoạt động (hoặc ít nhất là không theo cách nó có thể đọc). Khi nó đọc lại trạng thái của các tệp đó, có vẻ như bit thực thi đã được bỏ cố ý. Việc đặt core.filemode thành false sẽ yêu cầu git bỏ qua bất kỳ thay đổi bit thực thi nào trên hệ thống tệp để nó không xem đây là thay đổi. Nếu bạn cần thực hiện thay đổi bit thực thi, điều đó có nghĩa là bạn phải tự thực hiện 'git update-index --chmod = (+ | -) x '. –

+3

Nếu, như tôi, các thay đổi chế độ rất quan trọng, bạn có thể đặt core.filemode thành false, cam kết thay đổi mã thực tế của bạn, sau đó đặt core.filemode thành true và git sẽ giữ nguyên các thay đổi của tệp. –

+8

Tôi có cùng một vấn đề, nhưng đó là do sử dụng cùng một git repro thông qua SSH git cmd dòng, và thông qua Git Extensions trên một ổ đĩa được ánh xạ trong Windows! . . Giải pháp là như nhau, được thêm vào "config" [core] filemode = false –

6

Bạn có thể thử git reset --hard ĐẦU để thiết lập lại repo sang trạng thái mặc định mong đợi.

+4

Nếu git không thể đặt bit thực thi chính xác/nhất quán sau khi kéo, nó sẽ không công bằng hơn sau khi đặt lại. –

+0

Cách này hoạt động tốt cho một kho lưu trữ được sao chép nơi bản sao đã lật cờ. – AndrewCr

+1

+1 làm việc, sai lầm của tôi là chmod 777 .git thư mục – jimy

73

Đặt core.filemode thành false không hoạt động. Nhưng bạn phải chắc chắn rằng các thiết lập trong ~/.gitconfig không bị ghi đè bởi các thiết lập trong .git/config.

+2

Đã ở đó, đã làm điều đó. Đáng buồn thay tôi đã tìm thấy bình luận của bạn chỉ sau khi đã giải quyết vấn đề bản thân mình. Tuy nhiên, +1! –

+1

Nếu những người dùng khác nhân bản dự án này là trên Windows, có thể tốt nhất là chỉ áp dụng thay đổi cho tệp '~/.gitconfig'! –

4

Dường như bạn đã thay đổi một số quyền của thư mục. Tôi đã thực hiện các bước sau để khôi phục nó.

$ git diff > backup-diff.txt    ### in case you have some other code changes 

$ git checkout . 
0

Tôi chỉ có một tệp phiền hà với các quyền đã thay đổi. Để cuộn lại một cách riêng lẻ, tôi chỉ xóa nó theo cách thủ công với rm <file> và sau đó thực hiện thanh toán để lấy một bản sao mới.

May mắn là tôi chưa dàn dựng nó.

Nếu tôi có tôi có thể chạy git reset -- <file> trước khi chạy git checkout -- <file>

0

này xảy ra khi bạn kéo và tất cả các file đã thực thi trong kho từ xa. Làm cho chúng hoạt động trở lại sẽ đặt mọi thứ trở lại bình thường trở lại.

chmod +x <yourfile> //For one file 
chmod +x folder/* // For files in a folder 

Bạn có thể cần phải làm:

chmod -x <file> // Removes execute bit 

thay vào đó, cho các tập tin mà không được thiết lập như là thực thi và điều đó đã thay đổi vì các hoạt động nêu trên. Có một cách tốt hơn để làm điều này nhưng đây chỉ là một sửa chữa rất nhanh chóng và bẩn.

3

Tôi đã gặp sự cố này khi sao chép một repo git với các tệp đang hoạt động từ một ổ cứng cũ một vài lần. Vấn đề xuất phát từ thực tế là chủ sở hữu và quyền đã thay đổi từ ổ đĩa/máy cũ sang ổ đĩa/máy mới.Các dài và ngắn của nó được, chạy các lệnh sau để làm thẳng những điều trên (thanks to this superuser answer):

sudo chmod -R -x . # remove the executable bit from all files 

các lệnh cũ hơn sẽ thực sự giải quyết những khác biệt mà git diff được báo cáo, nhưng sẽ thu hồi khả năng của mình vào danh sách các thư mục, do đó ls ./ không thành công với ls: .: Permission denied. Để khắc phục điều đó:

sudo chmod -R +X . # add the executable bit only for directories 

Tin xấu là nếu bạn có bất kỳ tập tin bạn muốn giữ thực thi, như .sh kịch bản, bạn sẽ cần phải trở lại những. Bạn có thể thực hiện điều đó bằng lệnh sau cho mỗi tệp:

chmod +x ./build.sh # where build.sh is the file you want to make executable again 
+1

Cảm ơn, đã giúp tôi rất nhiều! Người ta cũng nên kiểm tra rằng 'git config core.filemode' được đặt thành' true', nếu không các thay đổi quyền sẽ không được phát hiện. Tôi cũng cần phải làm mới chỉ mục git sau mỗi thay đổi để chọn nó. –

+0

Giải pháp này là an toàn nhất nếu bạn lo lắng về các phụ thuộc bị ảnh hưởng. –

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