Не удалось заблокировать ссылки / главы / мастер удаленного репо
Мои проблемы относятся к ситуации, описанной в этом посте. В двух словах, есть удаленный репозиторий с открытыми и открытыми репозиториями. Согласно плану, мало кто (включая меня) должен иметь возможность перенести свои изменения в репо. 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, чтобы вы могли быть уверены, что он запускается одним и тем же пользователем каждый раз.