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递归地跳过读取任何内容。对于宽树和/或深树,这会产生巨大的差异,因此,即使未跟踪的目录也会在后台存储在缓存中(可以选择在第二个“拆分”索引缓存中)。