Git chmod 문제: 체크아웃 나사 실행 비트

Git chmod 문제: 체크아웃 나사 실행 비트

Ubuntu 및 Debian에서는 나중에 체크아웃을 시도할 때 마지막으로 커밋된 파일에 실행 비트가 설정됩니다. 그것은 매우 이상하고 나를 미치게 만듭니다.

$ 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

실행 비트가 언제, 왜 삽입되는지 아는 사람이 있나요? core.filemode으로 설정되어 있습니다 true.

그것이 어떻게든 중요한 경우 분기 전환 중에 vim에서 파일을 열어 두었습니다.

부록 1:권한이 엉망인 체크아웃입니다. 계속해서 게임을 플레이할 수 있습니다.

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

부록 2:그건 그렇고, 내가 커밋하는 이 저장소의 모든 파일에 대해 이런 일이 발생합니다. 성공적인 커밋 후에는 권한 문제 없이 브랜치를 전환할 수 없습니다.

답변1

Git 사용자는 아니지만 Git이 전체 파일 권한 마스크를 저장한다고 생각합니다.

이는 파일을 실행 파일로 설정한 후 Git이 이를 선택하여 저장소에 복제했다는 의미입니다. 따라서 커밋하기 전에 파일의 권한 마스크 자체를 변경해야 합니다.

Git이 이러한 변경 사항을 무시하도록 하려면 다음을 사용하세요.

git config core.filemode false

에서자식 구성(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.

답변2

커밋이나 체크아웃 중에 실행되는 커스텀 후크가 있는지 확인하셨나요? 파일을 변조하는 일부 사용자 지정 후크가 있을 수 있습니다. 체크아웃githooks 맨페이지.

Hooks는 기본적으로 특정 이벤트(커밋, 체크아웃 등)에서 git이 호출하는 작은 프로그램입니다.

답변3

dev-branch 브랜치에서 git commit -m 'mode is 644' 파일을 사용해 보셨나요?

나에게 무슨 일이 일어나고 있는지는 메인에 대한 권한을 변경한 다음 잘못된 권한이 있는 dev 분기를 끌어내려 로컬 권한을 방해하는 것 같습니다. 그런 다음 다시 커밋을 시도합니다. 복제, 변경, 커밋, 병합; 또는 단일 파일을 dev에 커밋하여 개별적으로 파일을 변경한 다음 병합해 보세요.

답변4

이 링크에 좋은 답변이 있습니다.

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

그리고

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

기본적으로 그렇게 해야 하며 git update-index --chmod=(+|-)x <file>이렇게 하면 권한을 추가/제거하기 위해 커밋하고 푸시해야 하는 변경 사항이 추가됩니다.

관련 정보