Отладка прав доступа к репозиторию git на общем ресурсе samba

Отладка прав доступа к репозиторию git на общем ресурсе samba

Я работаю с git-репозиториями, клонированными на samba share, около года, и, за исключением нескольких проблем с настройкой, никаких проблем с этим не возникло. Недавно я попытался добавить несколько файлов в существующий репозиторий и с удивлением увидел ошибки «отказано в доступе».

Теперь я могу инициализировать пустой репозиторий, но при попытке запустить 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

Я использую git 1.8.4.2, samba 4.1.1 на 64-битном Archlinux (версия ядра: 3.12.1). Я ничего не менял в конфигурации git и samba уже много лет.

Общий ресурс монтируется с помощью systemd automount в /etc/fstab:

//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

Он создает объекты с 0755разрешениями. Без sudoвременных объектов файлы остаются с 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

Ваша папка smb видна linux как в группе "другие". Поэтому ваши права должны быть чем-то вроде xx7, например, 777, если вы хотите, чтобы ваш www был доступен для записи всем группам.

Проблема, каждый раз, когда git создает новую папку, файл или что-то еще, он создает это, используя свои собственные разрешения. Решение — использовать umask, поэтому все, что создается под именем текущего пользователя, будет использовать указанные разрешения. В этом случае, общая папка Windows, вам понадобится это:

umask 000

поэтому любой новый файл будет доступен для записи всем, включая группу «другие», вот и все, ваша общая папка Windows.

Добавьте этот umask в ваш .bashrc, и проблема решена.

Связанный контент