我的问题涉及此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
表示我犯了一个错误吗?我该如何解决这个问题?
答案 0 :(得分:2)
这是文件系统权限的问题,可能是由于推送到裸存储库的人员使用不同的系统帐户来完成的。您必须记住,挂钩脚本在同一帐户下运行。如果裸机仓库和非裸机仓库中的任何权限都太有限,则在用户B也推送之后,用户A将无法完全通过此权限-一些文件和内部Git子目录将由A拥有,而某些则由B拥有。
因此,至关重要的是使用--shared
选项初始化两个存储库。您也可以在事后进行配置,但随后必须手动修复所有已存在且容易出错的文件系统的权限。从头开始重新创建非裸仓库可能会更容易。
但是,这还不够,因为--shared
仅影响Git自己的元数据,而不影响工作树。由于无法实际检出文件,因此您的提取仍可能失败。每次拉操作创建新目录时,对它们的权限可能会太严格。
解决此问题超出Git的范围-您可能需要研究:
如果您想避开这些问题,另一种选择是在经常运行的cronjob中更新非裸仓库,以确保每次都由同一用户运行。