Не удалось заблокировать ссылки / главы / мастер удаленного репо

Мои проблемы относятся к ситуации, описанной в этом посте. В двух словах, есть удаленный репозиторий с открытыми и открытыми репозиториями. Согласно плану, мало кто (включая меня) должен иметь возможность перенести свои изменения в репо. hooks/post-receive Этот файл позволяет автоматически вносить эти изменения в репозиторий non-bare на сервере. Это содержимое файла:

!/bin/sh
cd /data/11_prywatne/14_Pawel/repo_pawel_non_bare/deploy || exit
unset GIT_DIR
git pull origin master

`chmod g+rwx -R /data/11_prywatne/14_Pawel/repo_pawel_non_bare/deploy/ &> /dev/null`

Все шло хорошо, пока я был единственным, кто толкал и тянул к голому репо. Однако, когда-то другой человек git push origin master возникли некоторые проблемы. Например, пытаясь git pull origin master в удаленном репозитории non-bare (я знаю, что в этом нет необходимости, поскольку hooks/post-receive) Я получил эту ошибку:

fatal: Couldn't find remote ref master
fatal: The remote end hung up unexpectedly

Я пытался проверить с git log (на удаленном не-голом), что история коммитов и получил эту ошибку:

error: Could not read <hash of the commit made by the other person>
fatal: Failed to traverse parents of commit 68e6227f4c4f84843ed7dd4fc03a159

git status (на удаленном не пустом) возвращает следующий вывод:

# On branch master
error: Could not read <hash of the commit made by the other person>
error: Could not read <hash of the commit made by the other person>
fatal: Failed to traverse parents of commit 68e6227f4c4f84843ed7dd4fc03a15967051a97f

git push origin master (на удаленном не голом) возвращает:

error: Could not read <hash of the commit made by the other person>
fatal: Failed to traverse parents of commit 68e6227f4c4f84843ed7dd4fc03a15967051a97f
error: pack-objects died with strange error

(Еще на пульте не голый) потом решил git reset --hard и все казалось нормальным, но git push origin master получает меня:

error: unable to resolve reference refs/heads/master: Permission denied
remote: error: failed to lock refs/heads/master
To /data/11_prywatne/14_Pawel/gole.git/
 ! [remote rejected] master -> master (failed to lock)
error: failed to push some refs to '/data/11_prywatne/14_Pawel/gole.git/'
[user@server deploy]$ git pull origin master
fatal: git upload-pack: cannot find object <hash of the commit made by the other person>:
fatal: The remote end hung up unexpectedly

Я переключился на локальный репо и попытался подтолкнуть. Я получил те же ошибки, которые указали, что проблема вызвана Permission denied, Я попросил другого человека установить групповые разрешения для файла, который находится в голом репо refs/heads/master, Проблема, казалось бы, была решена, но при попытке git push origin master:

error: Ref refs/heads/master is at <hash of the commit made by the other person> but expected 0000000000000000000000000000000000000000
remote: error: failed to lock refs/heads/master
To server_ip:/data/11_prywatne/14_Pawel/gole.git/
 ! [remote rejected] master -> master (failed to lock)
error: failed to push some refs to 'user@server_ip:/data/11_prywatne/14_Pawel/gole.git/'

Пытаясь git pull origin master Я получил:

fatal: git upload-pack: cannot find object <hash of the commit made by the other person>:
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Просто для уточнения. Это содержание .git/config на моей локальной машине:

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = user@server_ip:/data/11_prywatne/14_Pawel/gole.git/
        fetch = +refs/heads/*:refs/remotes/origin/*

.git/config файл на компьютере другого человека отличается только в том, что касается URL, на который он указывает (user2@server:/data/11_prywatne/14_Pawel/gole.git/).

Тот же файл, но в репозитории non-bare на сервере:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = /data/11_prywatne/14_Pawel/gole.git/
[branch "master"]
        remote = origin
        merge = refs/heads/master

Вероятно, я пропустил несколько шагов при создании не голого репо. Должен ли я рассмотреть некоторые внутренние параметры git, которые позволяют создавать общие репозитории, не являющиеся открытыми? Мое использование chmod указать, что я допустил ошибку? Как я могу решить проблему с?

1 ответ

Это проблема с правами доступа к файловой системе, вероятно, вызванная тем, что люди, которые переходят в пустой репозиторий, используют разные системные учетные записи. Вы должны помнить, что скрипты хуков запускаются под одной учетной записью. Если какое-либо из разрешений как в хранилище, так и в хранилище не ограничено, слишком ограничено, пользователь A не сможет пройти через это полностью после того, как пользователь B также нажал - некоторые файлы и внутренние подкаталоги Git будут принадлежать A и некоторые Б.

По этой причине очень важно, чтобы оба репозитория были инициализированы с использованием --shared вариант. Вы можете настроить это и после факта, но тогда вам придется вручную исправить разрешения файловой системы для всего, что уже существует и подвержено ошибкам. Может быть, проще просто заново создать непонятный репо с нуля.

Однако этого все еще недостаточно, потому что --shared влияет только на собственные метаданные Git, а не на рабочее дерево. Ваша попытка все еще может потерпеть неудачу из-за неспособности фактически проверить файлы. Каждый раз, когда операция извлечения создает новые каталоги, разрешения для них могут быть слишком строгими.

Исправление этого выходит за рамки Git - вы можете посмотреть:

  • Наличие у всех пользователей изменения по умолчанию umask в их учетных записях на этом компьютере;
  • Установка общей основной группы пользователей для всех этих пользователей (не всегда возможно) ИЛИ
  • Использование POSIX ACL (что, по общему признанию, может быть довольно запутанным).

Если вы хотите обойти эти проблемы, другой вариант - обновить не обнаженное репо в часто выполняющемся cronjob, чтобы вы могли быть уверены, что он запускается одним и тем же пользователем каждый раз.

Другие вопросы по тегам