힘내 chmod 문제 : 체크 아웃 나사 exec 비트


10

우분투와 데비안에서 나중에 커밋 한 파일은 나중에 체크 아웃을 시도 할 때 실행 비트가 설정됩니다. 꽤 이상하고 나를 미치게합니다.

$ 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 : 그건 그렇고,이 저장소의 모든 파일에 대해 내가 저지른 일입니다. 성공적인 커밋 후에는 권한을 부여하지 않으면 분기를 전환 할 수 없습니다.


#seemingly all ok 단계에서 권한을 확인하셨습니까?
RobotHumans

동의합니다. dev-branch에서 'git-log master ... HEAD-파일'을 선택하고 지점과 현재 해당 파일에서 변경된 사항이 있는지 확인하십시오.
yuriismaster

@ aking1012 : 그렇습니다.이 시점에서 파일 모드가 이미 변경되었습니다. 질문을 업데이트하겠습니다.
Boldewyn

@yuriismaster : git-log쇼도의 조합에 대해 전혀 출력 master, dev-branch또는 HEAD(? 이상하다, 그것은해야하지 명령은 마지막에서 커밋 메시지를 인쇄하지하지 않습니다 master?)
Boldewyn

2
어떤 파일 시스템을 사용하고 있습니까?
비트 마스크

답변:


12

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.

1
실제로 올바른 권한으로 파일을 커밋하려고합니다. 나는 chmod'ing 후 모든 파일을 다시 커밋했습니다. 나는 때때로 Windows에서 일하기 때문에 (이 레포지토리가 core.fileMode아니라) 에 대해 알고 있지만 그것을 떠날 수 있기를 바랐습니다 true.
Boldewyn

그들이 "깨진 파일 시스템"이라고 부르는 작업을 할 때 git의 버그 일 수도 있습니다. 손상된 파일 시스템이없고 손상된 소프트웨어 만 있습니다.
harrymc

4
나는 지방 파괴하고있는 자식 개발자들과 동의해야
RobotHumans

3
파일 시스템이었습니다. 디렉토리가 NFS를 통해 마운트 된 다른 머신에서 재생할 수 없습니다. 메인 머신에서는 CIFS입니다. git 메일 링리스트에서 물었을 때 CIFS가 실행 비트와 관련하여 손상되었다는 대답을 얻었습니다. 꿰매다!
Boldewyn


3

커밋 또는 체크 아웃 중에 실행되는 사용자 지정 후크가 있는지 확인 했습니까? 파일을 변경하는 일부 사용자 정의 후크가있을 수 있습니다. 체크 아웃 githooks 맨 페이지를 .

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


좋은 시도이지만 내 .git/hooks디렉토리는 그대로입니다.
Boldewyn

1

분기 dev-branch에서 git commit -m 'mode is 644'파일을 사용해 보셨습니까?

나에게 그것은 일어나고있는 것처럼 보입니다 .main에 대한 권한을 변경 한 다음 잘못된 권한이있는 dev 분기를 풀고 로컬 권한을 방해합니다. 그런 다음 다시 커밋하려고합니다. 복제, 변경, 커밋, 병합 중 하나; 또는 하나의 파일 커밋을 사용하여 파일을 개별적으로 변경하여 dev로 병합 한 다음 병합하십시오.


1
사실, 나는 원래 시나리오에서 권한을 건드리지 않습니다. 모든 권한 변경은 'checkout'단계에서 git에 의해 수행됩니다.
Boldewyn

... 즉, chmod파일에 대해 한 번 ing을했지만 문제가 바로 발생하기 시작한 경우 불행히도 기억할 수 없습니다. 나는 그렇게 생각하지 않았다.
Boldewyn

나는 당신에게 문제를 복제하려고했지만 할 수 없습니다
RobotHumans 20:56에

탑재 된 CIFS ;-)에서 작동하지 않기 때문입니다. 시도에 대한 +1을 잊어 버렸습니다. 감사합니다!
Boldewyn

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.