Vấn đề Git chmod: Thanh toán vít thực thi bit


10

Trong Ubuntu và Debian, các tệp đã cam kết cuối cùng sẽ được thiết lập bit thực thi, khi tôi thử kiểm tra sau đó. Nó khá lạ và khiến tôi phát điên:

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

Có ai có ý tưởng, khi nào và tại sao bit thực thi trượt vào? core.filemodeđược đặt thành true.

Tôi có tệp mở trong vim trong khi chuyển nhánh, nếu điều đó quan trọng bằng cách nào đó.

Phụ lục 1: Đó là phần thanh toán, trong đó các quyền được vặn lên. Tôi có thể chơi trò chơi trên và trên:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

Phụ lục 2: Nhân tiện, điều này xảy ra đối với mọi tệp trong kho lưu trữ này mà tôi cam kết. Sau khi cam kết thành công, tôi không thể chuyển đổi chi nhánh mà không có sự cho phép.


Bạn đã kiểm tra các quyền tại #seemingly tất cả các bước ok ...
RobotHumans

Tôi đồng ý ở đây. Trên nhánh dev, 'git-log master ... HEAD - file' và xem có gì thay đổi giữa nhánh và bây giờ trên tệp đó không.
yuriismaster

@ aking1012: Có, tại thời điểm đó các chế độ tập tin đã thay đổi. Tôi sẽ cập nhật câu hỏi.
Boldewyn

@yuriismaster: git-logchương trình không có đầu ra ở tất cả, cho cả sự kết hợp của master, dev-branchhoặc HEAD(? đó là lạ, phải không không nên lệnh in cam kết cuối cùng thông điệp từ master?)
Boldewyn

2
Bạn đang dùng hệ thống tập tin nào?
bitmask

Câu trả lời:


12

Không phải là người dùng Git, nhưng tôi tin rằng Git lưu trữ toàn bộ mặt nạ cấp phép tệp.

Điều đó có nghĩa là bạn đã một lần đặt tệp thành tệp thực thi, được Git chọn và sao chép trong kho lưu trữ. Do đó, bạn phải tự thay đổi mặt nạ cấp phép của tệp trước khi cam kết.

Để làm cho Git bỏ qua những thay đổi như vậy, hãy sử dụng

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.

1
Trên thực tế, tôi cố gắng hết sức để cam kết các tệp với quyền chính xác. Tôi thậm chí đã cam kết lại tất cả các tệp sau khi xử lý chúng. Vì thỉnh thoảng tôi vẫn làm việc trên Windows (không phải với repo này), nhưng tôi biết core.fileMode, nhưng tôi hy vọng có thể rời khỏi nó true.
Boldewyn

Nó thậm chí có thể là một lỗi trong git khi làm việc trên cái mà họ gọi là "hệ thống tập tin bị hỏng". Không có hệ thống tập tin bị hỏng, chỉ có phần mềm bị hỏng.
harrymc

4
Tôi phải đồng ý với các nhà phát triển git rằng chất béo bị hỏng
RobotHumans

3
OK, đó là hệ thống tập tin. Tôi không thể sao chép nó trên một máy khác, nơi thư mục được gắn kết thông qua NFS. Trên máy chính, như tôi đã nói, CIFS. Khi tôi hỏi trong danh sách gửi thư git, tôi nhận được câu trả lời rằng CIFS bị hỏng liên quan đến các bit thực thi. Chết tiệt!
Boldewyn


3

Bạn đã kiểm tra xem có một hook tùy chỉnh được thực hiện trong khi xác nhận hoặc thanh toán không? Có thể có một số móc tùy chỉnh giả mạo các tập tin của bạn. Kiểm tra trang web của githooks .

Móc cơ bản là các chương trình nhỏ được gọi bởi git tại các sự kiện nhất định (cam kết, thanh toán, v.v.).


Tốt thử, nhưng .git/hooksthư mục của tôi là không bị ảnh hưởng.
Boldewyn

1

Bạn đã thử chế độ git commit -m 'là tệp 644' trên nhánh dev-Branch

Đối với tôi có vẻ như những gì đang xảy ra là bạn đang thay đổi quyền trên main sau đó kéo xuống nhánh dev có quyền sai, ghi đè quyền của bạn. sau đó cố gắng cam kết một lần nữa. hoặc nhân bản, thay đổi, cam kết, hợp nhất; hoặc thử thay đổi tệp riêng lẻ với một tệp cam kết thành dev rồi hợp nhất


1
Trên thực tế, tôi không bao giờ chạm vào quyền trong kịch bản gốc. Tất cả thay đổi quyền được thực hiện bởi git trong bước 'thanh toán'.
Boldewyn

... đó là, tôi đã thực hiện một số thao chmodtác một lần trên các tệp, nhưng tôi không thể nhớ, nếu vấn đề bắt đầu xảy ra ngay sau đó. Tôi nghĩ rằng nó đã không.
Boldewyn

tôi đã cố gắng tái tạo vấn đề của bạn và tôi không thể
RobotHumans

Đó là bởi vì bạn không làm việc trên CIFS được gắn kết ;-). Tôi đã quên +1 để thử, cảm ơn!
Boldewyn

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.