【问题标题】:Pushing and existing project into bare repo将现有项目推入裸仓库
【发布时间】:2014-01-29 15:48:53
【问题描述】:

我一直在使用 git 和 laravel 在本地开发一个项目。我最终决定向我们的服务器添加一个裸仓库,以便推送更改并自动部署。

我确定我做错了什么,因为我不习惯使用 git。当我进行推送时,我收到以下错误:

stdin: is not a tty
bash: git-receive-pack: command not found
fatal: Could not read from remote repository

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

这是我使用的过程 - 请记住,项目存储库最初是从 laravel 克隆的,我创建了自己的 master 分支,并且存在一些推送。我也已经设置了所有 ssh 日志记录。

  1. 通过 ssh 登录
  2. 已创建目录:mkdir public_html.git
  3. 更改目录:cd public_html.git
  4. 创建了回购:git init --bare
  5. 添加了一个接收后挂钩 - 我在测试项目中验证了该挂钩
  6. 移回本地机器
  7. 添加了一个新的遥控器:git remote add www user@0.0.0.0:public_html.git
  8. 新建了一个分支:git checkout -b develop
  9. 尝试推送:git push www

对此进行的大多数研究都提到了检查 git/config 文件,但所有这些似乎都是正确的。

【问题讨论】:

  • 检查服务器上目录的权限。在您的 git 远程 URL 中指定的用户必须对服务器上的该目录具有读/写权限。其次,您创建了一个本地分支,但在您的推送命令中,您没有告诉 Git 要推送哪些分支。相反,你想要:git push www -u develop
  • 组和所有者设置为用户。我在以该用户身份通过​​ ssh 登录时创建了它。权限是 775,这似乎足够了。我的理解是,如果你从 git push 中省略分支,它将使用当前分支头。我的活动分支是开发, git push www 应该推送开发分支。我确实注意到您有一个 -u 标志...我在文档中没有看到。

标签: git laravel


【解决方案1】:

看起来git-receive-pack 不在用于推送到存储库的用户配置的路径上。当您通过 ssh 推送到 git 存储库时,git 将使用 ssh 在执行推送的用户帐户下的远程服务器上执行命令。这些命令,例如git-receive-pack,必须在该用户在服务器上的路径上可用。为了诊断这一点,我将从执行命令开始

ssh user@0.0.0.0 which git-receive-pack

您几乎肯定会收到命令未找到错误。接下来你可以试试

ssh user@0.0.0.0 'echo $path' # Note the single quotes.

这将向您显示用户在远程服务器上的路径,并可能帮助您找出问题所在。注意 ssh 手册页中的行:

ssh ... [用户@]主机名 [命令]

...

如果指定了命令,它将在远程主机上执行,而不是登录 shell。

这可能是一个微妙但重要的区别,因为它意味着使用ssh user@0.0.0.0 创建的远程登录shell 可能与ssh user@0.0.0.0 some remote command 运行的命令看到的shell 环境不同。 This answer 解释了这对 bash shell 是如何工作的,其他的行为类似。

【讨论】:

  • 如果我运行ssh user@0.0.0.0 which git-receive-pack,我会收到which: no git-receive-pack in (/usr/local/bin:/bin:/usr/bin)。但是,如果我先通过 ssh 登录然后运行它,我会得到 /usr/local/cpanel/3rdparty/bin/git-receive-pack. Running ssh user@0.0.0.0 'echo $path' 我收到一个空的返回行。
  • 我还与另一个帐户进行了比较,并注意到该帐户中的 .bashrc 已重命名为 .bashrc_rm 。我对这个帐户做了同样的事情。如果不更改该文件名,运行上面的 'echo $path' 行将导致 stdin: not a tty 错误。
  • 好的 - 原来回声是由于 '$path' vs '$PATH' 现在 - 在我的测试帐户中,我(谁知道为什么)在我的 .ssh 目录中删除了一个名为“环境” - 我现在注意到我在推送到该帐户时遇到了同样的错误。所以也许我在那个文件中设置了 shell 环境?听起来对吗?抱歉,在这方面我是绿色的。如果是这种情况,我该如何改回来?
  • 好吧,就是这样。我通过 ssh 登录,然后运行 ​​env > .ssh/environment 然后重新启动 SSH。
  • @Veo 好的,看起来默认的 sshd 设置是拒绝这个,但如果你设置它可以工作,那么这是一个有效的修复。
猜你喜欢
  • 2022-06-13
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2012-11-27
相关资源
最近更新 更多