SSH是有状态还是无状态?

问题描述 投票:0回答:1

我是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://...仍处于活动状态并保持会话状态信息吗?

git ssh bitbucket git-lfs
1个回答
1
投票

作为Joachim Sauer points out in a comment,SSH本身显然(非常)有状态。但这无关紧要。您的问题假设Git-LFS在克隆操作中执行其特殊技巧。它不会这样做。Git-LFS的工作方式是用Git-LFS从第三方位置访问原始文件数据的数据替换“大”文件的存储Git对象数据(

blob

数据) (如您所述,通过https)。这意味着Git本身从未看到第三方位置。 Git不知道这种替换正在继续。实际替换发生在两点:

  1. 将文件从Git的索引复制到工作树时:Git-LFS使用

    smudge filter

    用实际数据替换访问数据(所有Git已存储)。 Git从来没有看到过真实的数据:它只存在于工作树和第三方位置。 Git仅看到Git-LFS干净过滤器生成的替代访问信息(请参阅下面的步骤2)。
  2. 当文件从工作树复制到索引时:Git-LFS使用

    干净过滤器

  3. 将实际数据发送到第三方位置,并用替代访问信息替换它。这就是Git永远看不到真实数据的原因:它永远不会进入索引,而Git会从索引进行新的提交。[每当Git通过索引通过git checkout通过工作树将文件

    to

复制到工作树]时,就会发生步骤1。每当您告诉Git通过git add将工作树文件复制回到索引中时,就会发生步骤2。还有一些极端的情况可以调用步骤1和/或2,但这是主要的两个。因此,当您执行git clone操作时,通过SSH连接传输的全部是

Git

数据:进入Git存储库的commit,tree,blob和带注释标签的对象, Git用于跟踪这些对象的其他数据,以所谓的smart protocol编码。此连接被关闭之前 Git运行git checkout
已关闭ssh连接,Git现在运行git checkout。这会在任何Git-LFS文件上运行污迹过滤器;必要时,Git-LFS中的污迹过滤器会在此时打开与第三方存储设施的https连接。
© www.soinside.com 2019 - 2024. All rights reserved.