Samba 공유에 대한 git repo 권한 디버깅

Samba 공유에 대한 git repo 권한 디버깅

나는 약 1년 동안 삼바 공유에 복제된 git 저장소를 사용해 왔으며 설정과 관련된 몇 가지 문제를 제외하고는 아무런 문제도 없었습니다. 최근에 기존 저장소에 일부 파일을 추가하려고 시도했는데 "권한 거부" 오류가 표시되어 놀랐습니다.

이제 빈 저장소를 초기화할 수 있지만 실행하려고 하면 다음과 같은 결과 strace git add test가 나타납니다.

    open(".git/objects/info/alternates", O_RDONLY|O_NOATIME) = -1 ENOENT (No such file or directory)
    access(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", F_OK) = -1 ENOENT (No such file or directory)
    open(".git/objects/e6/tmp_obj_GvIyn7", O_RDWR|O_CREAT|O_EXCL, 0444) = -1 EACCES (Permission denied)
    write(2, "error: insufficient permission f"..., 88error: insufficient permission for adding an object to repository database .git/objects
    ) = 88
    close(4)                                = 0
    write(2, "error: test: failed to insert in"..., 44error: test: failed to insert into database
    ) = 44
    write(2, "error: unable to index file test"..., 33error: unable to index file test
    ) = 33

저는 64비트 Archlinux(커널 버전: 3.12.1)에서 git 1.8.4.2, samba 4.1.1을 사용하고 있습니다. 나는 오랫동안 git이나 samba 구성에서 아무것도 변경하지 않았습니다.

공유는 /etc/fstab에서 systemd 자동 마운트를 사용하여 마운트됩니다.

//SERVER/DATA  /media/smb  cifs user,noauto,credentials=/etc/samba/creds,\
workgroup=PRV,uid=1000,gid=users,_netdev,comment=systemd.automount 0 0

마운트는 다음과 같이 나타납니다:

//SERVER/DATA on /media/smb type cifs (rw,nosuid,nodev,noexec,relatime,vers=1.0,
cache=strict,domain=PRV,uid=1000,forceuid,gid=100,forcegid,addr=10.1.1.5,
file_mode=0755,dir_mode=0755,nounix,serverino,rsize=61440,wsize=65536,actimeo=1)

권한:

    $ ls -lan .git/objects
    total 0
    drwxr-xr-x 2 1000 100 0 11-27 09:04 .
    drwxr-xr-x 2 1000 100 0 2013-11-27  ..
    drwxr-xr-x 2 1000 100 0 11-27 09:39 e6
    drwxr-xr-x 2 1000 100 0 11-27 09:04 info
    drwxr-xr-x 2 1000 100 0 11-27 09:04 pack

    $ ls -lan .git/objects/pack
    total 0
    drwxr-xr-x 2 1000 100 0 11-27 09:04 .
    drwxr-xr-x 2 1000 100 0 11-27 09:04 ..

나는 이미 시도했습니다:

  • 공유에 대해 다른 권한 설정 - 동일한 결과
  • 수동으로 장착 - 동일
  • Samba와 Git을 이전 버전으로 다운그레이드 - 차이 없음
  • sudo - 작동하지만 꼭 필요한 경우가 아니면 사용하고 싶지 않습니다.
  • mercurial (호기심에서) - git repo 복제가 실패하고 hg repo가 ​​문제 없이 복제됩니다.
  • sudo를 사용한 후 소유자 및 그룹 변경 - 명령 실행 전후에 동일하게 유지되는 것 같습니다.

디버깅하기 위해 더 할 수 있는 일이 있나요? 나는 git을 계속 사용하고 싶지만 권한에 무엇이 문제인지 전혀 알 수 없습니다.

sudo에 관해서 :

$ touch test
$ sudo strace git add test
open(".git/objects/info/alternates", O_RDONLY|O_NOATIME) = -1 ENOENT (No such file or directory)
access(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, ".git/objects/pack", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
getdents(5, /* 2 entries */, 32768)     = 48
getdents(5, /* 0 entries */, 32768)     = 0
close(5)                                = 0
open(".git/objects/e6/tmp_obj_i4e0C8", O_RDWR|O_CREAT|O_EXCL, 0444) = 5
brk(0xd5a000)                           = 0xd5a000
write(5, "x\1K\312\311OR0`\0\0\t\260\1\360", 15) = 15
brk(0xd4a000)                           = 0xd4a000
brk(0xd3a000)                           = 0xd3a000
close(5)                                = 0
link(".git/objects/e6/tmp_obj_i4e0C8", ".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391") = 0
unlink(".git/objects/e6/tmp_obj_i4e0C8") = 0
lstat(".git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391", {st_mode=S_IFREG|0755, st_size=15, ...}) = 0
close(4)   

$ ls -lan .git/objects/e6
total 1
drwxr-xr-x 2 1000 100  0 11-28 10:11 .
drwxr-xr-x 2 1000 100  0 11-28 10:10 ..
-rwxr-xr-x 1 1000 100 15 11-28 10:11 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
-r-xr-xr-x 1 1000 100  0 11-28 10:11 tmp_obj_9Z8UgU
-r-xr-xr-x 1 1000 100  0 11-28 10:10 tmp_obj_d0yhDJ

권한이 있는 개체를 생성합니다 0755. sudo임시 개체 파일이 없으면 0555. 0444일반 사용자로 파일을 생성하는 데 문제가 있는 것 같습니다 .것 같다전체 저장소에 대한 쓰기 권한을 갖습니다.

답변1

아마도 루트에서 를 사용하여 이 저장소를 변경했을 가능성이 높으며 sudo이제 일부 파일은 .git루트가 소유하게 됩니다. chown파일 소유권을 일반적으로 사용하는 사용자로 재설정하려면 다음을 수행하십시오 .

답변2

3.12의 커널 버그입니다.https://bugzilla.kernel.org/show_bug.cgi?id=66251

@bjauy가 언급한 대로 다운그레이드하거나 3.13으로 업그레이드하세요.

답변3

제가 실행하고 있던 커널 버전에 버그가 있었습니다. 커널을 3.11.6으로 다운그레이드하고 git add/commit사용자가 다시 작업을 시작했습니다.

답변4

smb 폴더는 Linux에서 "others" 그룹으로 표시됩니다. 따라서 모든 그룹에서 www를 쓸 수 있게 하려면 권한이 xx7과 같아야 합니다(예: 777).

문제는 git이 새 폴더, 파일 등을 생성할 때마다 자체 권한을 사용하여 생성한다는 것입니다. 해결책은 umask를 사용하는 것입니다. 그러면 현재 사용자의 이름으로 생성된 모든 것이 지정된 권한을 사용하게 됩니다. 이 경우 Windows 공유 폴더에는 다음이 필요합니다.

우마스크 000

따라서 모든 새 파일은 "others" 그룹을 포함한 모든 사람이 쓸 수 있게 됩니다. 그게 바로 공유 Windows 폴더입니다.

.bashrc에 이 umask를 추가하면 문제가 해결됩니다.

관련 정보