git+ssh 在像 git+ssh://git@github.com/xxx.git 这样的 npm repo 路径中是啥意思

Posted

技术标签:

【中文标题】git+ssh 在像 git+ssh://git@github.com/xxx.git 这样的 npm repo 路径中是啥意思【英文标题】:What does git+ssh mean in an npm repo path like git+ssh://git@github.com/xxx.gitgit+ssh 在像 git+ssh://git@github.com/xxx.git 这样的 npm repo 路径中是什么意思 【发布时间】:2020-03-18 17:22:02 【问题描述】:

我看到了一个 npm 存储库,它在 package.json 中被称为 git+ssh://git@github.com/xxx.git。我知道这是 ssh 协议,但我不知道 git+ssh 在克隆 repo 时会做什么,我只使用git@github.com/xxx.git。我用谷歌搜索,但没有找到任何结果。

【问题讨论】:

【参考方案1】:

当通过 git 托管 npm 包时,npm 还需要知道使用哪种传输协议将包文件从 repo 传输到客户端。为此,存在以下选项:ssh、https、http、文件(请参阅https://docs.npmjs.com/cli/install)。

npm 的创建者决定将此信息放在协议名称中,并用+ 符号分隔信息,这样它就更具有示意性。因此,当npm install 遍历您的依赖项并看到与git+ssh 的依赖项时,它知道它将通过ssh 连接到repo,然后使用您本地的git 二进制文件在本地签出项目文件。

我猜他们也可以将协议命名为gitwithssh,如gitwithssh://git@github.com/xxx.git,但git+ssh 看起来更简洁且逻辑上分开,因此更容易通过正则表达式进行解析。

这里是 npm 源代码中实际负责将协议信息拆分为type(=git)和实际协议(例如ssh)的部分:https://github.com/npm/npm-package-arg/blob/v7.0.0/npa.js#L221

我只使用 git@github.com/xxx.git。

您不能使用这种格式将包注册为 npm 的依赖项。尝试执行npm i git@github.com/xxx.git - 它不起作用。这种格式只能用于例如通过git clone

但是,您可以在使用 ssh 协议作为前缀时使用此格式:ssh://git@github.com/xxx.git。这实际上是 npm 在幕后使用的“git+ssh”的“标准化”形式(另请参阅 https://github.com/npm/normalize-git-url 如何将您的 git+ssh://... 转换为 ssh://git@...)。

【讨论】:

当我意识到我的问题与 npm 相关时,我找到了docs.npmjs.com/cli/install,它描述了可用于从 git 远程 URL 安装包的协议。希望对您有所帮助。【参考方案2】:

从 NPM 的角度来看,这类似于任何其他远程设置。许多依赖管理器支持通过 SSH 使用 Git。在底层,这会驱动 Git 通过 SSH 连接。最终结果是 NPM 克隆存储库并将其安装到您的 node_modules 目录中。

当 Git 与远程存储库通信时,它使用 SSH 启动两个程序之一:git-upload-packgit-receive-pack。存储库作为这些命令的一个选项提供。 SSH 使用一种隧道机制来使用pkt-line 协议向这些远程程序发出命令。有关该协议的更多详细信息,请参阅Git source。

【讨论】:

以上是关于git+ssh 在像 git+ssh://git@github.com/xxx.git 这样的 npm repo 路径中是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

git如何使用ssh密钥

Windows 的 .ssh/config 文件 (git)

命令 '['git' 'clone', '--recurse-submodules', '--', 'ssh://git@git/b2b/py_client.git'] 返回非零退出状态 128

ssh git clone 超时

xcode 使用ssh git管理

git分布式的理解----简单服务端搭建