Git plumbing 哪些管道命令实现与git add相同的功能?
我想通过学习进入时实际发生的事情来更好地理解Git plumbing 哪些管道命令实现与git add相同的功能?,git-plumbing,git,git-add,Git Plumbing,Git,Git Add,我想通过学习进入时实际发生的事情来更好地理解 git添加$DIRECTORY 及 git添加$FILE 它是如何工作的 通过阅读这本书可以大致了解情况 如果$DIRECTORY是一个目录,则类似于find$DIRECTORY-type f-execgit add{},即递归地将所有文件添加到$目录中。然后,git add$FILENAME将应用于每个文件 检查.gitignore(及其“上级”) 对.gittributes进行检查,运行clean过滤器(如果适用) 清洁ed内容 然后,索
git添加$DIRECTORY
及
git添加$FILE
它是如何工作的
通过阅读这本书可以大致了解情况
- 如果
是一个目录,则类似于$DIRECTORY
,即递归地将所有文件添加到find$DIRECTORY-type f-execgit add{}
。然后,$目录中
将应用于每个文件git add$FILENAME
- 检查
(及其“上级”).gitignore
- 对
进行检查,运行.gittributes
过滤器(如果适用)clean
ed内容清洁
然后,索引以某种方式得到更新,这涉及到。但那里到底发生了什么?目录树是否只包含添加的文件,还是包含以前提交的所有文件?接下来会发生什么?
git add
没有一个等效的管道命令,但最接近的命令可能是git update index
。程序描述正确:
add
指定的文件列表,对于现在已知不在目录中的文件(即已删除)和具有特殊索引状态的文件(--假定未更改和--跳过工作树
)。换言之,此步骤还参考当前索引
.gitignore
)并将其从列表中丢弃(带有警告),除非给出-f
/--force
(旁注:我没有在子目录上测试过这一点,-f
可能不适用于递归扫描获取的子目录条目,而只适用于命令行上实际给出的名称。如果是这样,则步骤2必须与步骤1结合使用,这样即使使用也不会添加名称>-f
)
git update index--add--remove--replace
将修改后的文件写入存储库,并更新其索引项,包括模式更新。(对于在步骤3中清理的文件,您必须使用一个单独的git散列对象-w
,正如您所建议的,并使用--index info
而不是--add--remove--replace
)
git mktree
命令根本不会进入这个过程,因为索引本身只是一个平面文件,使用的是文档记录不完整的格式(或者更准确地说,是几种格式之一;请参见--index version
)
索引允许每个文件名最多四个条目,称为阶段:阶段0是一个普通缓存条目,阶段1到3用于冲突合并。有几个特殊位用于标记已删除的文件,或--假定未更改,--跳过工作树,--有意添加,以及一些特殊的内部使用标志,以及-即使Git不存储目录,也有目录的索引项(Git可以查看目录的ctime
字段,然后Git可以快速跳过未修改的目录,前提是它可以信任操作系统来维护它)
只有在将索引转换为一系列树对象时,git mktree
命令才起作用。git必须为索引中的每个子目录创建一棵树,再加上一棵表示整个索引的顶级树。(子项目(如果存在)已作为“gitlink”出现在索引中条目,即它们在包含它们的树中的显示方式。)是的,Git是否在每次执行diff
或add
等操作时都会对所有内容进行递归搜索?Git是否在每次执行diff
或add
等操作时都会对文件系统中的所有内容进行递归搜索?@Geremia:非常多,尽管细节变化很大。索引有一个特殊的“加速”功能作为缓存的角色,如果所讨论的目录上的时间戳与索引本身中存储的时间戳相匹配,则允许Git递归地跳过读取任何内容。对于宽树和/或深树,这会产生巨大的差异,因此,即使未跟踪的目录也会在后台存储在缓存中(可以选择在第二个“拆分”索引缓存中)。