Làm cách nào để xóa các tệp nói chế độ cũ của chế độ 100755 chế độ mới 100644, từ các thay đổi chưa được thực hiện trong Git?


723

Vì một số lý do, khi ban đầu tôi rút 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 trong bản sao làm việc của mình mà không có thay đổi rõ rệt nào được thực hiện cho chúng, nhưng vẫn hiển thị trong unstaged changeskhu vực của tôi .

Tôi đang sử dụng Git Gui trên Windows xp và khi tôi nhìn vào tệp để xem những 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?

Làm cách nào tôi có thể đưa các tệp này ra khỏi danh sách các thay đổi chưa được phân loại? (Rất khó chịu khi phải trải qua 100 tệp, chỉ để chọn các tệp tôi đã chỉnh sửa gần đây và muốn cam kết).

Câu trả lời:


1286

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

Câu trả lời của vấn đề msysgit này đề nghị đặt core.filemode thành false để thoát khỏi vấn đề:

git config core.filemode false

132
+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 tra, nhưng khi nó cố gắng thực hiện thì nó không hoạt động (hoặc ít nhất là không theo cách mà nó có thể đọc được). Khi nó đọc lại trạng thái của các tệp đó, có vẻ như bit thực thi đã được cố tình bỏ đặt. Đặt core.filemode thành false sẽ cho git bỏ qua mọi thay đổi bit thực thi 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 một thay đổi bit thực thi, điều đó có nghĩa là bạn phải thực hiện thủ công git update-index --chmod=(+|-)x <path>.
CB Bailey

7
Nếu, giống 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 và sau đó đặt core.filemode thành true và git sẽ bảo toàn các thay đổi tệp.
Michael T. Smith

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 dòng SSH git cmd và thông qua Tiện ích mở rộng Git 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
Ian Vaughan

2
Đó là một sự cứu rỗi, cảm ơn ngài! Điều này đã xảy ra với tôi trên OSX, sau khi tôi chia sẻ một kho lưu trữ nhân bản trên thư mục công cộng và thay đổi quyền cho các tệp.
Thiago Ganzarolli

8
@robsch Bạn có thể sử dụng git config --global ...để đặt tùy chọn trong tệp cấu hình toàn cầu của mình.
Amber

98

Cài đặt core.filemodethành false không hoạt động, nhưng hãy đảm bảo rằng các cài đặt ~/.gitconfigkhông bị ghi đè bởi những người trong đó .git/config.


3
Đã từng trải qua rồi. Đáng buồn là tôi chỉ tìm thấy bình luận của bạn sau khi đã tự giải quyết vấn đề. Tuy nhiên, +1!
David Schmitt

1
Nếu những người dùng khác đang sao chép dự án này trên Windows, tốt nhất nên thực sự chỉ áp dụng thay đổi cho ~/.gitconfigtệp!
Ian Vaughan

Nếu bạn muốn kiểm tra trên Windows Powershell. git config --list --show-origin | sls filemodehoặc trên Linux git config --list --show-origin | grep filemode. Điều này sẽ cho bạn thấy nơi bạn cần thực hiện các điều chỉnh.
Frank Fu

Bạn đóng đinh nó !! Làm tốt.
Kim

27

Tôi đã gặp phải vấn đề này khi sao chép một git repo với các tệp làm việc từ ổ cứng cũ một vài lần. Vấn đề bắt nguồn từ việc chủ sở hữu và quyền đã thay đổi từ ổ đĩa / máy cũ sang ổ đĩa mới. Dài và ngắn của nó là, chạy các lệnh sau để làm rõ mọi thứ ( nhờ câu trả lời siêu người dùng này ):

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

Lệnh cũ sẽ thực sự giải quyết các khác biệt mà git diff đã báo cáo, nhưng sẽ thu hồi khả năng liệt kê các thư mục của bạn, vì vậy ls ./không thành công 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 nào bạn muốn giữ thực thi, chẳng hạn như .shtập lệnh, bạn sẽ cần phải hoàn nguyên chúng. Bạn có thể làm điều đó với lệnh sau cho mỗi tệp:

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

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

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.
Jin

9

Thường xảy ra khi repo được sao chép giữa các máy Windows và Linux / Unix.

Chỉ cần nói với git để bỏ qua thay đổi tên tệp, đây là một số cách:

  1. Cấu hình CHỈ cho repo hiện tại:

    git config core.filemode false
    
  2. Cấu hình trên toàn cầu:

    git config --global core.filemode false
    
  3. Thêm vào ~ / .gitconfig:

    [core]
         filemode = false
    

Chỉ cần chọn một trong số họ.


Cấu hình toàn cầu không hoạt động vì (tôi đoán) git tạo một repo với các tùy chọn này được đặt thành đúng (Tôi đã tạo một repo trong linux)
Herrgott

4

Có vẻ như bạn đã thay đổi một số quyền của thư mục. Tôi đã làm 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 .

3

Bạn có thể thử thiết lập lại git - hãy chọn ĐẦU để đặt lại repo về trạng thái mặc định dự kiến.


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

2
Tôi đã chuyển một số dự án sang ổ đĩa USB (fat32) và quay lại máy ub Ubuntu của tôi (ext4) và kết thúc với một loạt các tệp đã thay đổi, tốt, các thuộc tính. git reset --hard HEADlàm việc hoàn hảo cho tôi cảm ơn
cirovladimir

7
-1. OP tuyên bố "chỉ để chọn các tệp tôi đã chỉnh sửa gần đây và muốn cam kết". Điều này sẽ loại bỏ những chỉnh sửa quá.
whitfin

9
-1 Gợi ý lệnh này trong git tương tự như nói "bạn chỉ có thể rm -rf ./, tôi chắc chắn rằng nó sẽ không có bất kỳ hậu quả không lường trước nào".
Kzqai

1
Không, điều này không có ích và đây là vấn đề. Bạn đặt lại và dọn dẹp và trạng thái git vẫn hiển thị các thay đổi chế độ. Đây là một vấn đề nghiêm trọng với windows git và tôi nghĩ nó nên được sửa chữa, không chỉ khắc phục bằng cách bỏ qua chế độ tập tin.
vezenkov

2

Tôi đã phải đối mặt với cùng một vấn đề. Và điều này cứu mạng tôi: https://gist.github.com/jtdp/5443498

git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never  \
| git apply`

1

Điều này xảy ra khi bạn kéo và tất cả các tệp đã được thực thi trong kho lưu trữ từ xa. Làm cho chúng thực thi được một lần nữa sẽ khiến mọi thứ trở lại bình thường.

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 đó, đối với các tệp không được đặt là có thể thực thi được và nó đã bị thay đổi do thao tác 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 và bẩn.


1

Bạn có thể sử dụng lệnh sau để thay đổi chế độ tập tin của bạn trở lại. git add --chmod=+x -- filename Sau đó cam kết với chi nhánh.


0

Tôi chỉ có một tệp rắc rối với các quyền đã thay đổi. Để cuộn lại, tôi chỉ cần xóa thủ công rm <file>và sau đó thực hiện kiểm tra để 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ạygit checkout -- <file>


0

Tôi chỉ gặp vấn đề này khi khác chi nhánh của tôi với chủ. Git đã trả về một lỗi 'chế độ' khi tôi dự kiến ​​chi nhánh của mình giống hệt với chủ. Tôi đã sửa bằng cách xóa tệp và sau đó hợp nhất lại chủ.

Đầu tiên tôi chạy diff:

git checkout my-branch
git diff master

Điều này trở lại:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Sau đó tôi chạy như sau để sửa:

rm bin/script.sh
git merge -X theirs master

Sau này, git difftrả lại không có sự khác biệt giữa chi nhánh của tôi và chủ.

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.