Câu hỏi Làm thế nào để làm cho Git bỏ qua chế độ tập tin (chmod) thay đổi?


Tôi có một dự án mà trong đó tôi phải thay đổi chế độ tệp chmod đến 777 trong khi phát triển, nhưng không nên thay đổi trong repo chính.

Git nhặt lên chmod -R 777 . và đánh dấu tất cả các tệp là đã thay đổi. Có cách nào để làm cho Git bỏ qua thay đổi chế độ đã được thực hiện cho các tập tin?


1891
2017-10-16 21:43


gốc


Điều này rất hữu ích khi làm việc với git trên Windows + Bash trên Ubuntu trên Windows - Elazar
Đối với bất kỳ ai chỉ muốn bỏ qua các thay đổi quyền cho một yêu cầu cụ thể về git diffvà do đó, người không muốn thay đổi các tệp cấu hình Git của họ: bạn có thể sử dụng git diff -G. mỗi Zed's câu trả lời đây. - sampablokuper


Các câu trả lời:


Thử:

git config core.fileMode false

Từ git-config (1):

core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

Các -c cờ có thể được sử dụng để thiết lập tùy chọn này cho các lệnh một lần:

git -c core.fileMode=false diff

--global cờ sẽ làm cho nó trở thành hành vi mặc định cho người dùng đã đăng nhập.

git config --global core.fileMode false

Cảnh báo

core.fileMode không phải là thực hành tốt nhất và nên được sử dụng cẩn thận. Cài đặt này chỉ bao gồm bit thực thi của chế độ và không bao giờ đọc / ghi bit. Trong nhiều trường hợp, bạn nghĩ rằng bạn cần cài đặt này bởi vì bạn đã làm một việc như chmod -R 777, làm cho tất cả các tệp của bạn có thể thực thi được. Nhưng trong hầu hết các dự án hầu hết các tệp không cần và không được thực thi vì lý do bảo mật.

Cách thích hợp để giải quyết loại tình huống này là xử lý quyền thư mục và tệp riêng biệt, với một cái gì đó như:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Nếu bạn làm điều đó, bạn sẽ không bao giờ cần phải sử dụng core.fileMode, ngoại trừ trong môi trường rất hiếm.


3117
2017-10-16 21:53



Nếu bạn làm git config --global core.filemode false bạn sẽ chỉ cần làm điều này một lần cho tất cả các repos. - Greg
điều này đã không làm việc cho tôi cho đến khi tôi đã cố định các trường hợp nó nên được fileMode thay vì filemode - tishma
@tishma: phần cấu hình Git và tên biến là không phân biệt chữ hoa chữ thường theo tài liệu, xem phần FILE CONFIGURATION, vì vậy nếu điều trên không hiệu quả với bạn thì đó là vì một lý do khác. - Greg Hewgill
@donquixote: The git config lệnh ghi cài đặt vào tệp cấu hình chính xác (.git/config chỉ cho kho lưu trữ hiện tại, hoặc ~/.gitconfig nếu được sử dụng với --global). - Greg Hewgill
@ zx1986: Nó không quan trọng. Từ cấu hình git: "Các tên biến có phân biệt chữ hoa chữ thường, ..." - Greg Hewgill


thay đổi chế độ hoàn tác trong cây đang hoạt động:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Hoặc trong mingw-git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

247
2018-01-18 02:20



Trên OS X Lion, bỏ qua -d'\n' một phần của xargs vì đây là một đối số bất hợp pháp (và không cần thiết). - Pascal
Bạn có thể bỏ qua bất kỳ lỗi nào về "chmod: toán hạng còn thiếu sau` + x '" - Casey Watson
điều này có cập nhật không? Tôi nhận được 'chmod: quá ít đối số' trong mingw - hammett
@Pascal @pimlottc Lệnh -d chỉ định dấu phân tách là dòng mới thay vì bất kỳ khoảng trống nào. Các xargs BSD không có tùy chọn đó, nhưng thay vào đó bạn có thể tạo đầu ra thông qua tr '\n' '\0' và sau đó sử dụng -0 arg để xargs để sử dụng NUL như dấu phân tách. - Mark Aufflick
Cool, cái tr điều đã làm việc! Đây là lệnh đầy đủ cho OSX: git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x - K.-Michael Aye


Nếu bạn muốn đặt tùy chọn này cho tất cả các repos của bạn, hãy sử dụng --global Tùy chọn.

git config --global core.filemode false

Nếu điều này không làm việc bạn có thể đang sử dụng một phiên bản mới hơn của git vì vậy hãy thử --add Tùy chọn.

git config --add --global core.filemode false

Nếu bạn chạy nó mà không có tùy chọn --global và thư mục làm việc của bạn không phải là một repo, bạn sẽ nhận được

error: could not lock config file .git/config: No such file or directory

115
2018-04-21 12:00



Không hoạt động với tôi trên phiên bản git 1.7.9.6 (Apple Git-31.1) - Filip Kunc
Có vẻ như sau này sử dụng GIT --add, như trong git config --add --global core.filemode false - mgaert
Nếu cấu hình cục bộ của repo đã có filemode = true thì việc thay đổi cấu hình chung sẽ không giúp ích vì cấu hình cục bộ sẽ ghi đè lên cấu hình chung. Sẽ phải thay đổi cấu hình cục bộ của từng repo của máy một lần - Syed Rakib Al Hasan
XIN VUI LÒNG: Cập nhật câu trả lời này với cảnh báo của syedrakib! Tất cả mọi thứ cảm thấy điên rồ trước khi tôi tìm thấy nó, và có ý nghĩa hoàn hảo sau đó. - jerclarke


Nếu

git config --global core.filemode false

không hoạt động cho bạn, hãy làm theo cách thủ công:

cd into yourLovelyProject folder

cd vào thư mục .git:

cd .git

chỉnh sửa tệp cấu hình:

nano config

thay đổi true thành false

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

lưu, thoát, chuyển đến thư mục phía trên:

cd ..

reinit git

git init

Bạn xong việc rồi!


66
2017-08-06 13:10



Thay vì chỉnh sửa .git/config, đơn giản git config core.fileMode false trong thư mục gốc của dự án của bạn là đủ. Nếu bạn chỉnh sửa tệp cấu hình, bạn nên loại bỏ hoàn toàn chỉ thị, để toàn bộ tệp được chọn. - Felix
-1 nếu git config --global không hoạt động, nghĩa là bạn không có quyền thực hiện ở cấp hệ thống, xóa global tùy chọn thực hiện chính xác điều tương tự như chỉnh sửa thủ công .git / config - CharlesB
@CharlesB không chính xác - câu trả lời đã cung cấp giải pháp thay thế bằng cách đặt tùy chọn trực tiếp vào dự án, làm cho dự án trở nên cụ thể. Điều này sẽ không hoạt động với các dự án git khác mà bạn thực hiện / thanh toán trong tương lai, nhưng hoạt động cho dự án bạn đang làm việc. (hãy chắc chắn rằng chúng tôi phân biệt ~/.gitconfigvà ~/project/.git/config) - sircapsalot
Một khi điều này đã chạy git init chúng ta có nên đặt filemode trở lại đúng không? - Jordan


Đang thêm vào Greg Hewgill trả lời (của việc sử dụng core.fileMode biến cấu hình):

Bạn có thể dùng --chmod=(-|+)x tùy chọn của git update-index (phiên bản cấp thấp của "git add") để thay đổi quyền thực thi trong chỉ mục, từ đó nó sẽ được chọn nếu bạn sử dụng "git commit" (và không phải "git commit -a").


48
2017-10-16 22:03



Điều này cần phải được chỉnh sửa thành câu trả lời của Greg Hewgill thay vì được thêm vào như một câu trả lời riêng biệt, do đó tạo ra một câu trả lời tối cao với một biểu diễn rõ ràng duy nhất. - Greg
@Greg: Người ta cần có đủ điểm để chỉnh sửa câu trả lời không phải của riêng mình; Tôi nghĩ rằng tôi không có đủ quyền chỉnh sửa tại thời điểm đó. - Jakub Narębski
@ Jakub Tôi nghĩ rằng bạn có đủ danh tiếng ngay bây giờ :) Lệnh này sẽ như thế nào cho một tập tin ví dụ? - Alex Hall


Bạn có thể định cấu hình nó trên toàn cầu:

git config --global core.filemode false

Nếu những điều trên không hiệu quả với bạn, lý do có thể là cấu hình cục bộ của bạn sẽ ghi đè cấu hình chung.

Xóa cấu hình cục bộ của bạn để làm cho cấu hình chung có hiệu lực:

git config --unset core.filemode

Ngoài ra, bạn có thể thay đổi cấu hình cục bộ của mình thành đúng giá trị:

git config core.filemode false


32
2018-01-21 09:12



Nếu câu trả lời chính không giúp bạn - hãy thử câu trả lời này. Nếu bạn muốn kiểm tra cấu hình cục bộ của mình mà không sửa đổi nó, hãy kiểm tra git config -l (liệt kê cấu hình hiện tại - cả địa phương và toàn cục) - Krzysztof Bociurko


Nếu bạn đã sử dụng chmod lệnh sau đó đã kiểm tra sự khác biệt của tập tin, Nó cho thấy chế độ tập tin trước đó và chế độ tập tin hiện tại như:

chế độ mới: 755

chế độ cũ: 644

đặt chế độ cũ của tất cả các tệp bằng lệnh dưới đây

sudo chmod 644 .

bây giờ đặt core.fileMode thành false trong tập tin cấu hình bằng cách sử dụng lệnh hoặc thủ công.

git config core.fileMode false

sau đó áp dụng lệnh chmod để thay đổi quyền của tất cả các tệp như

sudo chmod 755 .

và một lần nữa đặt core.fileMode thành true.

git config core.fileMode true

Để thực hành tốt nhất, đừng giữ core.fileMode sai luôn.


16
2017-10-13 07:34



Bạn đang nói rằng toàn bộ một dự án (trong phát triển, dàn dựng và sản xuất) phải là 755? - Daniel
@Daniel Feb: Không. Chỉ thay đổi chế độ của các tệp cần thiết. - Kishor Vitekar
For best practises don't Keep core.fileMode false always ý bạn là gì, bạn nên giải thích điều đó. - bg17aw
For best practises don't Keep core.fileMode false always. Một số hệ thống tệp (ví dụ FAT) không hỗ trợ quyền tệp, vì vậy hệ điều hành sẽ báo cáo giá trị mặc định (766 trên hệ thống của tôi). Trong trường hợp này, core.filemode là hoàn toàn cần thiết trong cấu hình cục bộ, trừ khi bạn muốn bloat lịch sử cam kết với các thay đổi quyền không cần thiết và không chủ ý - KevinOrr
Ngoài ra, tại sao bạn bận tâm thay đổi perms trở lại ở tất cả? Nếu bạn đặt core.filemode=false sau đó git sẽ bỏ qua các thay đổi thực thi bit, không cần phải thay đổi quyền cục bộ. Trừ khi bạn đã thêm các thay đổi quyền cho chỉ mục, trong trường hợp đó bạn đang bỏ lỡ bước mà bạn sẽ cần git add sau khi bạn tắt core.filemode. - KevinOrr