在git-clone期间使用主动模式FTP而不是被动模式?

时间:2012-12-11 16:27:53

标签: git curl ftp git-clone

我在远程服务器上有一个GIT存储库,我想通过FTP访问它。出于某些不幸的原因,服务器仅允许主动模式FTP而不是被动模式。即如果我使用curl(git clone使用的相同客户端)直接下载文件,则以下命令有效:

curl -P - ftp://user:pass@server/file

但是取出-P -会导致卷曲一直持续到超时。

问题是我无法弄清楚如何告诉git clone使用活动模式进行FTP。当我设置GIT_CURL_VERBOSE=1并执行git clone ftp://user:pass@server/repo时,我注意到它正在发送PASV而不是PORT,并且在没有-P -开关的情况下像curl一样挂起。我怎么告诉它不这样做?我读了一下_netrc文件,但找不到通过它设置活动模式的示例。

对于任何好奇的人,以下是来自git clone的详细卷曲输出(与运行curl几乎相同而未指定-P -选项。)

* About to connect() to server.com port 21 (#0)
*   Trying {server ip}... * 0x98d548 is at send pipe head!
* Connected to server.com ({server ip}) port 21 (#0)
< 220 Microsoft FTP Service
> USER User
< 331 Password required for User.
> PASS {pass}
< 230 User User logged in.
> PWD
< 257 "/User" is current directory.
* Entry path is '/User'
> CWD repo.git
< 250 CWD command successful.
> CWD info
< 250 CWD command successful.
> EPSV
* Connect data stream passively
< 500 'EPSV': command not understood
* disabling EPSV usage
> PASV
< 227 Entering Passive Mode ({server ip},10,137).
*   Trying {server ip}... * Connecting to {server ip} ({server ip}) port 2697
/* server hangs from here until time-out */

使用为curl指定的-P -选项,将使用PORT命令代替PASV,因此从EPSV行开始将发送以下命令到服务器:

> EPRT |1|{client ip}|13375|
< 500 'EPRT |1|{client public ip}|36093|': command not understood
* disabling EPRT usage
> PORT {client ip},52,64
< 200 PORT command successful.
* Connect data stream actively
> TYPE I
< 200 Type set to I.
> SIZE file
< 213 213
> RETR file
< 150 Opening BINARY mode data connection for file(213 bytes).
/* and the file just downloads from here. */

我的配置:msysgit,MS-FTP服务器。

1 个答案:

答案 0 :(得分:1)

Git实际上deprecated FTP,可能是因为这样的困难:

  

Git支持ssh,git,http和https协议(另外,ftp,   和ftps可用于获取,rsync可用于获取   推动,但这些效率低下并被弃用;不使用   它们)。

最好的办法是将远程服务器从FTP服务器rsync到本地裸克隆,并将其重新克隆到工作副本。