Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Git进行子模块稀疏签出?_Git_Git Submodules_Git Sparse Checkout - Fatal编程技术网

如何使用Git进行子模块稀疏签出?

如何使用Git进行子模块稀疏签出?,git,git-submodules,git-sparse-checkout,Git,Git Submodules,Git Sparse Checkout,有很多关于稀疏签出的文章和问题。不幸的是,我没有找到具体的例子。我希望获得以下示例工作: 创建子模块 创建项目 A在这一点上,我希望sub文件夹只包含foo/foo而不是bar。不幸的是,它不起作用: $ ls bar/ foo/ 如何使其工作?git子模块add本身会检查子模块 对我来说成功的是: git init #我没有找到一种方法在一个步骤中添加子模块而不签出 git clone--深度=1--不签出../sub git子模块添加../sub git子模块absorbgitdirs #

有很多关于稀疏签出的文章和问题。不幸的是,我没有找到具体的例子。我希望获得以下示例工作:

创建子模块 创建项目 A在这一点上,我希望
sub
文件夹只包含
foo/foo
而不是
bar
。不幸的是,它不起作用:

$ ls
bar/ foo/

如何使其工作?

git子模块add
本身会检查子模块

对我来说成功的是:

git init
#我没有找到一种方法在一个步骤中添加子模块而不签出
git clone--深度=1--不签出../sub
git子模块添加../sub
git子模块absorbgitdirs
#注:没有“submodule.sub.sparsecheckout”键
git-C sub-config core.sparseCheckout true
#注意引用通配符以避免它们被shell扩展
echo'foo/*'>>.git/modules/sub/info/sparse checkout
git子模块更新--强制--签出子模块
(2020年第1季度),您将使用新命令

使用Git2.28(2020年第3季度),记录了
稀疏签出设置对子模块的影响

参见作者(2020年6月10日)
(于2020年6月22日合并)

:澄清与子模块的交互 签字人:以利亚·纽伦
审核人:德里克·斯托利

暂时忽略稀疏签出功能,如果一个人有一个子模块,并在其中创建带有未推送更改的本地分支,并且可能会向其中添加一些未跟踪的文件,那么我们希望避免意外删除这样的子模块

例如,如果你跑步

git checkout v2.13.0
然后,即使sha1collisiondetection/子模块在v2.14.0之前不作为子模块存在,也不会删除它

同样,如果您之前只签出并运行了v2.13.0

git checkout v2.14.0
尽管sha1collisiondetection/子模块是v2.14.0的一部分,但它不会自动初始化

在这两种情况下,git都要求分别初始化或取消初始化子模块

此外,我们还在其他命令(如clean)中对子模块进行特殊处理,这需要两个
--force
标志来删除未跟踪的子模块,并且一些命令具有
--recurse子模块
标志

稀疏签出与签出非常相似,这一点可以从相似的名称得到证明——它在工作副本中添加和删除文件

但是,出于同样的避免数据丢失的原因,我们不希望使用签出从工作副本中删除子模块,也不希望使用稀疏签出

因此子模块需要单独初始化或去初始化;更改稀疏签出规则不应自动触发子模块的删除或激活

我相信之前关于子模块的措辞只是关于这个特定的问题

不幸的是,前面的措辞可能被解释为暗示子模块应被视为活动的,而不管稀疏模式如何

更新措辞以避免产生此类暗示

这可能有助于考虑两个例子,其中措辞差异变得重要:

将来,我们希望用户能够运行如下命令

git clone --sparse=moduleA --recurse-submodules $REPO_URL
自动设置稀疏路径,并自动初始化稀疏路径中的子模块

我们不希望使用该命令自动初始化任何路径中的所有子模块

类似地,我们希望能够做类似的事情

git -c sparse.restrictCmds grep --recurse-submodules $REV $PATTERN
并在记录的稀疏模式中通过
$REV
搜索
$PATTERN

我们希望它递归到那些稀疏模式中的子模块中,但不希望递归到与稀疏模式不匹配的目录中以搜索可能的子模块

因此,现在包括:

如果存储库包含一个或多个子模块,则会根据与
git submodule
命令的交互来填充子模块。
具体来说,
git submodule init--
将确保位于
的子模块存在,而
git submodule deinit[-f]--
将删除位于
的子模块的文件(包括任何未跟踪的文件、未提交的更改和未刷新的历史记录)。
与稀疏签出从工作树中删除文件但仍在索引中保留条目的方式类似,取消初始化的子模块从工作目录中删除,但在索引中仍保留条目

由于子模块可能有未推送的更改或未跟踪的文件,删除它们可能会导致数据丢失。
因此,更改稀疏包含/排除规则不会导致已签出 要从工作副本中删除的子模块。
换句话说,正如
签出
一样,即使在删除或添加分支之间切换,也不会导致子模块自动删除或初始化 子模块,使用
稀疏签出
来减少或扩展“感兴趣”文件的范围,也不会导致子模块自动取消初始化或初始化

此外,上述事实意味着工作副本中可能不存在“跟踪”文件的多个原因:稀疏签出的稀疏模式应用程序和子模块初始化状态。
因此,像
git grep
这样的命令在工作副本中处理跟踪文件时,可能会返回受其中一个或两个限制限制的结果


在Git2.31(2021年第1季度)中,“”()被调整为仅限于稀疏签出路径

由于在稀疏checkedout子模块中可能需要
git grep
,这一点很重要

参见作者(2021年2月9日)
(于2021年2月25日合并)

:在工作树搜索上执行稀疏签出 推荐人:Elijah Newren
签字人:Matheus Tavares
审核人:Elijah Newren

在稀疏签出存储库上,()(wi
git clone --sparse=moduleA --recurse-submodules $REPO_URL
git -c sparse.restrictCmds grep --recurse-submodules $REV $PATTERN