SSH是有状态还是无状态?

时间:2019-11-22 08:06:48

标签: git ssh jwt bitbucket git-lfs

我是git用户,这里是使用ssh协议的git clone。

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

  1. 例如git clone的{​​{1}}命令 在此克隆操作期间,SSH请求是有状态的或无状态的。

  2. 我已启用git LFS来获取大文件,但LFS文件传输是通过https进行的。 如果我的git clone涉及LFS文件,那么我的git clone命令将调用https请求。在这种情况下,主会话git clone ssh://git@<serverurl>:7999/text/large_files.git仍处于活动状态并保持会话状态信息吗?

1 个答案:

答案 0 :(得分:2)

Joachim Sauer points out in a comment一样,SSH本身显然(有一点)是有状态的。但这无关紧要。您的问题假定Git-LFS在克隆操作期间执行其特殊技巧。它不会这样做。

Git-LFS的工作方式是用Git-LFS用来从文件中访问原始文件数据的数据替换“大”文件中存储的Git对象数据( blob 数据)。第三方位置(如您所述,通过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通过git add将工作树文件复制回到索引中时,就会发生步骤2。还有其他一些极端情况可以调用步骤1和/或2,但这是主要的两个。

因此,当您执行git clone操作时,通过SSH连接传输的全部是 Git 数据:提交,树,blob和带注释标签的对象进入Git存储库,然后Git用于跟踪这些对象的其他数据(以所谓的 smart协议进行编码)。 在Git运行git checkout之前,此连接已关闭。

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