Samba 共有の Git リポジトリ権限のデバッグ

Samba 共有の Git リポジトリ権限のデバッグ

私は約 1 年間、Samba 共有にクローンされた 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 automount を使用してマウントされます。

//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 リポジトリのクローン作成は失敗しますが、hg リポジトリは問題なくクローン作成されます
  • 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

権限付きでオブジェクトを作成します0755sudo一時オブジェクトファイルがなければ、通常のユーザーとして0555ファイルを作成するときに問題が発生しているようです。0444思われるリポジトリ全体への書き込み権限を持つ。

答え1

おそらく、 を使用することにより、root でこのリポジトリに変更を加えたためsudo、 内の一部のファイル.gitが root によって所有されるようになりました。 を実行して、chownファイルの所有権を通常使用するユーザーにリセットします。

答え2

これは 3.12 のカーネル バグです。https://bugzilla.kernel.org/show_bug.cgi?id=66251

@bjauy が述べたようにダウングレードするか、3.13 にアップグレードしてください。

答え3

実行していたカーネル バージョンにバグがありました。カーネルを 3.11.6 にダウングレードし、git add/commitユーザーとして再び作業を開始しました。

答え4

Linux では、smb フォルダは「その他」グループとして認識されます。したがって、www をすべてのグループが書き込み可能にしたい場合は、権限を xx7 (たとえば 777) のようにする必要があります。

問題は、Git が新しいフォルダー、ファイルなどを作成するたびに、独自の権限を使用して作成することです。解決策は、umask を使用することです。これにより、現在のユーザーの名前で作成されたすべてのものが指定された権限を使用します。その場合、Windows 共有フォルダーでは、次のものが必要になります。

umask 000

したがって、新しいファイルは、「その他」グループを含むすべてのユーザーが書き込み可能になり、それが共有 Windows フォルダーになります。

この umask を .bashrc に追加すれば問題は解決します。

関連情報