【问题标题】:Clone a remote Git repo (Server denied you to change to the given directory)克隆远程 Git 存储库(服务器拒绝您更改到给定目录)
【发布时间】:2023-03-04 08:14:05
【问题描述】:

我在远程服务器上设置了一个 git repo。 我正在尝试使用此命令在我自己的 PC 上克隆它:

git clone ftp://x.x.x.x/testGit/testGit

但我不断收到错误:

致命:无法访问“ftp://x.x.x.x/testGit/”:服务器拒绝您更改到给定目录

相同的网址在我的浏览器中运行良好,我不太明白...

我在这个配置中使用vsftpd:

listen=YES
anonymous_enable=YES
local_enable=NO
write_enable=NO
local_root=/home/play/

我没有想法......

【问题讨论】:

  • 那个 git repo 是在监听 ftp 端口吗?每当我从 github 或 bitbucket 克隆时,协议总是 http 或 https。
  • “监听 ftp 端口”是什么意思?我正在通过 FTP 协议访问 repo,是否可以为此在 git 中进行调整?

标签: git ftp clone vsftpd


【解决方案1】:

你需要在服务器上运行git update-server-info :)

如果存储库是非裸存储库(即有一个.git 目录),您还需要将/.git 附加到@Rohit Pothuraju 提到的路径中。


您如何调试此类问题?

我的第一次尝试是从 vsftpd 中获取详细日志。我阅读了手册并设置了相关选项,但它不起作用(日志为空)。

所以我转而拦截 TCP 连接。最原始的方法是让三个终端窗口运行以下命令:

1. nc -v x.x.x.x 21     # connect to the real server
2. nc -l -v -p 1234     # listen on some port
   # if it says "This is nc from the netcat-openbsd package", remove the '-p'
3. git clone ftp://localhost:1234/testGit/ testGit
   # the program you want to debug, but with the server address replaced

现在您将在终端 1 中看到来自服务器的消息,在终端 2 中看到来自程序的消息。当您在一个终端中看到消息时,将其复制并粘贴到另一个终端中。继续进行,直到会话结束。

提示:

  • -v 标志使 netcat 打印一两行调试行。确保不要在两个终端之间复制它们!在 1 号航站楼,这应该类似于

    localhost [123.0.01] (?) open
    

    在 2 号航站楼应该类似于

    listening on [any] 1234...
    connect to [127.0.0.1] from localhost [1237.0.0.1] 53929
    
  • 对于某些协议(例如 FTP),服务器会发送第一条消息。程序连接后不要忘记复制该消息,否则它将永远等待。

【讨论】:

  • 感谢您的调查!我试过git update-server-info,它什么也没说,当我试图克隆回购时它仍然没有工作。然后我尝试了netcat这个东西,但问题是,如果我理解正确,我必须在我自己的PC上打开那些终端,而不是在服务器上,对吧?如果是这样,我在 Windows 上,我没有 netcat 命令。
  • @Zenoo:该死,我确定这就是问题所在。命令git update-server-info 在 git 目录中创建文件 info/refs 和 objects/info/packs。你能在网络浏览器中打开ftp://x.x.x.x/testGit/info 并检查refs 是否存在并且有一些内容吗?
  • @Zenoo:我对netcat拦截的描述确实是在本地PC上运行,但是如果你有SSH访问权限并且服务器没有防火墙,你也可以在服务器上进行。使用两个 SSH 会话在服务器上运行命令 1 和 2,而不是在 PC 上本地运行。在命令 1 中,将 x.x.x.x 替换为 localhost。在命令 3 中,将 localhost 替换为 x.x.x.x。如果在运行命令 3 时出现连接错误,则需要使用 SSH 端口转发。告诉我。
  • .git 中确实有一个info 文件夹。在refs 中,有heads 和tags 文件夹。我现在通过 SSH 试试 netstat
  • 我在尝试设置第二个终端时遇到此错误:This is nc from the netcat-openbsd package. An alternative nc is available in the netcat-traditional package. usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]] 。我猜我用错了nc 命令,但我真的不知道为什么。
【解决方案2】:

我建议你试试这个..

git 克隆ftp://username:password@ftp.company.com:PORT/project.repo/.git

它可能会起作用....

【讨论】:

  • 我将我的vsftpd 设置为匿名使用,所以我不需要给用户/通行证。我也尝试添加/.git,但它发送给我:RETR responde: 550。
  • 其权限被拒绝错误。我认为您必须提供用户名和密码才能获得授权访问
  • 我已经尝试过不使用 vsftpd 的匿名选项。我在克隆命令中写了用户名和密码,但是没有用。
  • 如果您在使用用户名和密码后仍然出现权限被拒绝错误,我认为该文件在某种程度上受到了限制
  • lsmod | grep conntrack
猜你喜欢
  • 1970-01-01
  • 2018-03-02
  • 2013-06-24
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2011-04-03
  • 2012-05-06
  • 2011-01-26
相关资源
最近更新 更多