【问题标题】:Is SSH Stateful or Stateless?SSH 是有状态的还是无状态的?
【发布时间】:2023-04-09 19:10:01
【问题描述】:

我是 git 用户,我的上下文是使用 ssh 协议的 git clone。

当我使用SSH协议进行git操作时,我有以下问题。

  1. git clone 命令例如:git clone ssh://git@<serverurl>:7999/text/large_files.git 在此克隆操作期间,SSH 请求是有状态或无状态的。

  2. 我已启用 git LFS 以获取大文件,但 LFS 文件传输通过 https。 如果我的 git clone 涉及 LFS 文件,那么我的 git clone 命令会调用 https 请求。在这种情况下,主会话 git clone ssh://... 仍然处于活动状态并维护会话状态信息?

【问题讨论】:

  • 想到的一个状态是 SSH 连接依赖于具有状态的底层 TCP/IP 连接,因此按照这种逻辑,SSH 基本上是有状态的。

标签: git ssh jwt bitbucket git-lfs


【解决方案1】:

作为Joachim Sauer points out in a comment,SSH 本身显然是(微不足道的)有状态的。但这没关系。您的问题假设 Git-LFS 在克隆操作期间执行其特殊技巧。它不这样做。

Git-LFS 的工作方式是将“大”文件的存储 Git 对象数据(blob 数据)替换为 Git-LFS 用于从第三方位置(如您所述,通过 https)。这意味着 Git 本身永远不会看到第三方位置。 Git 不知道这种替换正在进行。

实际替换发生在两点:

  1. 当文件从 Git 的索引复制到工作树时:Git-LFS 使用 smudge 过滤器 将访问数据(Git 存储的所有数据)替换为真实的数据。 Git 永远不会看到真实的数据:它只存在于工作树和第三方位置。 Git 只能看到 Git-LFS 清理过滤器生成的替代访问信息(参见下面的步骤 2)。

  2. 当文件从工作树复制到索引时:Git-LFS 使用 clean 过滤器 将实际数据发送到第三方位置,并将其替换为替代访问信息。这就是为什么 Git 永远不会看到真实数据的原因:它永远不会进入索引,而 Git 从索引中进行新的提交。

只要 Git 通过索引通过git checkout 将文件复制到工作树,就会发生第 1 步。每当您通过git add 告诉 Git 将工作树文件复制回索引时,都会发生第 2 步。还有一些特殊情况会调用步骤 1 和/或 2,但这是主要的两个。

因此,当您执行 git clone 操作时,您通过 SSH 连接传输的只是 Git 数据:提交、树、blob 和注释标签对象进入Git 存储库,以及 Git 用来跟踪这些对象的其他数据,这些数据以所谓的 智能协议 编码。此连接在之前关闭 Git 运行 git checkout

关闭 ssh 连接后,Git 现在运行 git checkout。这将对任何 Git-LFS 文件运行涂抹过滤器; Git-LFS 中的污点过滤器此时会在必要时打开与第三方存储设施的 https 连接。

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2014-05-07
    • 2021-11-07
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多