Git工作在http但不是ssh

时间:2011-09-28 16:01:05

标签: git ssh

我有一个远程存储库,当我通过http进行通信时工作正常,但是如果我使用ssh,它会在尝试推送时给出错误。

目标:让repo通过ssh

工作

我可以直接ssh直接进入远程机器,git repo和git工作目录中的所有文件夹和文件都有771个权限,所有者是apache,group是'test'(用户我正在测试) 'test'是其成员)。我也尝试将所有者和群组更改为“测试”,但这没有帮助。我已经确认用户帐户能够通过ssh从git目录中读/写/执行。

由于使用了virtualmin,我有一个非标准的目录设置:
/ home / test(用户主页)
/ home / test / public_html(web root)
/ home / test / public_html / git(gitweb目录)
/home/test/public_html/git/git.git(repo目录)

当我在本地执行任何git命令(直接在远程服务器上)时,这会导致与下面相同的错误消息(没有这样的文件或目录),除非我指定--git-dir和--work-tree,但是,因为http正在工作并且推送到远程服务器不应该知道远程工作目录,我不知道这是怎么回事(并且也看不到如何修复它)。< / p>

另外,如果它是相关的,我使用的是密码验证而不是密钥。

有没有人想过如何解决/进一步诊断这个问题?

错误

git push origin:

Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 309 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
error: unable to create temporary sha1 filename ./objects/1d: No such file or directory

fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To test@test.local:/home/test/public_html/git/git.git/
! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'test@test.local:/home/test/public_html/git/git.git/'

更多信息

git push origin(当使用HTTP到http://test@test.local/git/git.git/时):

Password: 
Password: 
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
updating 'refs/heads/master'
  from 425f5c3810b1c9e4ecc7ee7df3cd1bb8818b2115
  to   65d2358df3035689116339a14f504f34a6212a27
    sending 3 objects
    done
Updating remote server info
To http://test@test.local/git/git.git/
   425f5c3..65d2358  master -> master

(我有点困惑,为什么http和ssh之间存在很大差异; http会问我两次密码,然后开始提取远程头,而ssh会问我一次密码然后开始计数对象。)

git pull origin:

Already up-to-date

git remote show origin:

* remote origin
  Fetch URL: test@test.local:/home/test/public_html/git/git.git/
  Push  URL: test@test.local:/home/test/public_html/git/git.git/
  HEAD branch: master
  Remote branches:
    master  tracked
    release tracked
  Local branches configured for 'git pull':
    master  merges with remote master
    release merges with remote release
  Local refs configured for 'git push':
    master  pushes to master  (fast-forwardable)
    release pushes to release (up to date)

如果它有用,我的本地配置文件:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = test@test.local:/home/test/public_html/git/git.git/
[branch "master"]
    remote = origin 
    merge = refs/heads/master
[branch "release"]
    remote = origin
    merge = refs/heads/release

远程配置文件:

[core] 
   repositoryformatversion = 0
   filemode = true
   bare = false
   worktree = /home/test/public_html
   sharedRepository = true

进一步调查

在Jan的评论之后,我进一步调查了这个问题。我假设在推送ssh期间只使用'test'帐户(和http推送使用的apache),但我认为它必须是两者。

我已经通过非工作仓库返回并设置所有权与工作仓库中的相同(一些文件/文件夹是apache.test,其他是test.test,配置文件是root.test)。

我没有完全检查所有内容,但是repo目录中的文件,以及对象,引用和信息下的所有文件和文件夹在工作和非工作中都具有相同的所有权和权限,并且用户帐户设置在同样的方式(我之前在故障排除中尝试过777)。

我能想到的主要区别是,在非工作仓库中,我开始使用http然后切换到ssh,而在工作仓库中我直接使用ssh并且repo在此之前是空的。也许有一个奇怪的文件在哪里有错误的权限打破了一切,或者在实际文件中有些奇怪的事情我使用不同的协议而烦恼,或者可能因为我试图让它工作的时间而腐败昨天。

2 个答案:

答案 0 :(得分:1)

我在不同的用户帐户下设置了一个全新的远程存储库,现在它正常工作。所有设置都或多或少相同(这次权限不太严格),所以我不确定问题是什么。

答案 1 :(得分:1)

如果您在网上搜索您收到的错误消息的确切文本,则会返回大量点击。从快速查看它们,它似乎是一个许可问题。

您说您拥有apache.test拥有的存储库。但是,apache实际上是以apache.test运行吗?如果没有,由apache create运行的git服务器的新目录将由不同的组(无论是服务器的主要组)拥有,并且test用户不能在那里写,尽管你告诉git使用repo group-writable。

您有几种选择:

  1. 使用suExec将git cgi作为test.test运行并删除群组可写权限。
  2. 使用Web服务器的主要组作为拥有组
  3. 让每个人都可写的回复(core.sharedRepository = everybody
  4. 应该可以通过将core.sharedRepository设置为2664来将回购SGID设置为正确的组,但我对此不太确定。
  5. 我个人更喜欢suExec。

相关问题