无法锁定裁判/裁判/主远程裸回购

时间:2019-02-22 13:04:52

标签: git permission-denied git-remote git-bare

我的问题涉及此post中描述的情况。简而言之,有一个远程的裸仓库和一个非裸仓库。根据计划,很少有人(包括我在内)应该能够将他们的更改推送到裸仓库中。 hooks/post-receive文件使这些更改有可能被自动拉入服务器的非裸仓库中。这是文件的内容:

!/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时(我知道这是没有必要的,因为存在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文件仅在指向其指向(user2@server:/data/11_prywatne/14_Pawel/gole.git/)的URL时有所不同。

相同的文件,但是在服务器的非裸仓库中:

[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 个答案:

答案 0 :(得分:2)

这是文件系统权限的问题,可能是由于推送到裸存储库的人员使用不同的系统帐户来完成的。您必须记住,挂钩脚本在同一帐户下运行。如果裸机仓库和非裸机仓库中的任何权限都太有限,则在用户B也推送之后,用户A将无法完全通过此权限-一些文件和内部Git子目录将由A拥有,而某些则由B拥有。

因此,至关重要的是使用--shared选项初始化两个存储库。您也可以在事后进行配置,但随后必须手动修复所有已存在且容易出错的文件系统的权限。从头开始重新创建非裸仓库可能会更容易。

但是,这还不够,因为--shared仅影响Git自己的元数据,而不影响工作树。由于无法实际检出文件,因此您的提取仍可能失败。每次拉操作创建新目录时,对它们的权限可能会太严格。

解决此问题超出Git的范围-您可能需要研究:

  • 让所有用户在该计算机上的帐户中更改其默认umask;
  • 为所有这些用户设置一个通用的主要用户组(并不总是可行的),或者
  • 使用POSIX ACL(公认的,这可能会很混乱)。

如果您想避开这些问题,另一种选择是在经常运行的cronjob中更新非裸仓库,以确保每次都由同一用户运行。