Git 中文参考(八)(1)https://developer.aliyun.com/article/1565791
使用–REFRESH
--refresh不计算新的 sha1 文件或使模式/内容更改的索引更新。但是做的是将文件的统计信息与索引“重新匹配”,以便您可以刷新尚未更改的文件的索引但是 stat 条目的位置是过时了。
例如,你想在执行 git read-tree 之后执行此操作,将 stat 索引详细信息与正确的文件链接起来。
使用–CACHEINFO 或–INFO-ONLY
--cacheinfo用于注册不在当前工作目录中的文件。这对于最小检出合并非常有用。
假装你在模式和 sha1 的路径上有一个文件,说:
$ git update-index --add --cacheinfo <mode>,<sha1>,<path>
--info-only用于注册文件而不将它们放在对象数据库中。这对仅状态存储库很有用。
--cacheinfo和--info-only的行为类似:索引已更新,但对象数据库未更新。当对象在数据库中但文件在本地不可用时,--cacheinfo很有用。当文件可用时,--info-only很有用,但您不希望更新对象数据库。
使用–INDEX-INFO
--index-info是一种更强大的机制,允许您从标准输入中提供多个条目定义,并专门为脚本设计。它可以采用三种格式的输入:
- 模式 SP 类型 SP sha1 TAB 路径
这种格式是将git ls-tree输出填充到索引中。 - 模式 SP sha1 SP 阶段 TAB 路径
这种格式是将更高阶的阶段放入索引文件中,并匹配 git ls-files --stage 输出。 - 模式 SP sha1 TAB 路径
任何 Git 命令都不再生成此格式,但update-index --index-info将继续支持此格式。
要为索引放置更高的阶段条目,首先应通过为路径提供 mode = 0 条目,然后以第三种格式提供必要的输入行来删除路径。
例如,从这个索引开始:
$ git ls-files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0 frotz
您可以将以下输入提供给--index-info:
$ git update-index --index-info 0 0000000000000000000000000000000000000000 frotz 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
输入的第一行输入 0 作为删除路径的模式;只要格式良好,SHA-1 无关紧要。然后第二行和第三行为该路径提供阶段 1 和阶段 2 条目。在上述之后,我们最终会得到:
$ git ls-files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
使用“ASSUME UNCHANGED”BIT
Git 中的许多操作依赖于您的文件系统以实现高效的lstat(2)实现,因此可以便宜地检查工作树文件的st_mtime信息,以查看文件内容是否已从索引文件中记录的版本更改。不幸的是,一些文件系统效率低lstat(2)。如果您的文件系统是其中之一,则可以将“假设未更改”位设置为未更改的路径,以使 Git 不执行此检查。请注意,在路径上设置此位并不意味着 Git 将检查文件的内容以查看它是否已更改 - 它使 Git 省略任何检查并假设它已更改而不是。当您对工作树文件进行更改时,您必须通过在修改它们之前或之后删除“假定未更改”位来明确告知 Git。
要设置“假定未更改”位,请使用--assume-unchanged选项。要取消设置,请使用--no-assume-unchanged。要查看哪些文件设置了“假设未更改”,请使用git ls-files -v(参见 git-ls-files [1] )。
该命令查看core.ignorestat配置变量。如果是这样,使用git update-index paths...更新路径,并使用更新索引和工作树的其他 Git 命令更新路径(例如 git apply --index , git checkout-index -u 和 git read-tree -u )自动标记为“假设不变”。注意,如果git update-index --refresh发现工作树文件与索引匹配,则“假定未更改”位为而不是设置(如果要将它们标记为“假设未更改”,请使用git update-index --really-refresh)。
例子
要仅更新和刷新已检出的文件:
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
On an inefficient filesystem with core.ignorestat set
$ git update-index --really-refresh (1) $ git update-index --no-assume-unchanged foo.c (2) $ git diff --name-only (3) $ edit foo.c $ git diff --name-only (4) M foo.c $ git update-index foo.c (5) $ git diff --name-only (6) $ edit foo.c $ git diff --name-only (7) $ git update-index --no-assume-unchanged foo.c (8) $ git diff --name-only (9) M foo.c
- 强制 lstat(2)为匹配索引的路径设置“假定未更改”位。
- 标记要编辑的路径。
- 这样做 lstat(2)并找到索引匹配路径。
- 这样做 lstat(2)并找到索引而不是匹配路径。
- 将新版本注册到索引集“假定未更改”位。
- 并假设不变。
- 即使你编辑它。
- 你可以告诉我事后的变化。
- 现在它检查 lstat(2)并发现它已被更改。
SKIP-WORKTREE BIT
Skip-worktree 位可以在一个(长)句子中定义:当读取条目时,如果它被标记为 skip-worktree,那么 Git 假装其工作目录版本是最新的并且改为读取索引版本。
详细说明,“阅读”意味着检查文件是否存在,读取文件属性或文件内容。工作目录版本可能存在或不存在。如果存在,其内容可能与索引版本匹配。写入不受此位影响,内容安全仍然是第一优先。请注意,Git _ 可以 _ 更新工作目录文件,标记为 skip-worktree,如果安全的话(即工作目录版本与索引版本匹配)
虽然这个位看起来类似于假设未改变的位,但它的目标与假设未改变的位不同。当两者都设置时,Skip-worktree 也优先于假定未更改的位。
分裂指数
此模式适用于具有非常大索引的存储库,旨在减少重复编写这些索引所需的时间。
在此模式下,索引分为两个文件:$ GIT_DIR / index 和$ GIT_DIR / sharedindex。< SHA-1>。更改将在$ GIT_DIR / index(拆分索引)中累积,而共享索引文件包含所有索引条目并保持不变。
当拆分索引中的条目数达到 splitIndex.maxPercentChange 配置变量指定的级别时,拆分索引中的所有更改都会被推回到共享索引文件中(请参阅 git-config [1] )。
每次创建新的共享索引文件时,如果旧的共享索引文件的修改时间早于 splitIndex.sharedIndexExpire 配置变量指定的值,则删除旧的共享索引文件(请参阅 git-config [1] )。
为了避免删除仍在使用的共享索引文件,每次创建或读取基于共享索引文件的新拆分索引时,其修改时间将更新为当前时间。
UNTRACKED CACHE
此缓存旨在加速涉及确定未跟踪文件(例如git status)的命令。
此功能的工作原理是记录工作树目录的 mtime,然后忽略对 mtime 未更改的目录中的文件的读取目录和 stat 调用。为此,如果添加,修改或删除目录中的文件,则底层操作系统和文件系统必须更改目录的st_mtime字段。
您可以使用--test-untracked-cache选项测试文件系统是否支持该文件系统。 --untracked-cache选项用于在旧版本的 Git 中隐式执行该测试,但情况已不再如此。
如果要启用(或禁用)此功能,则使用core.untrackedCache配置变量(参见 git-config [1] )比使用git update-index选项更容易使用git update-index每个存储库,特别是如果您想在所使用的所有存储库中执行此操作,因为您可以在$HOME/.gitconfig中将配置变量设置为true(或false)一次,并使其影响您触摸的所有存储库。
更改core.untrackedCache配置变量时,下次命令读取索引时,会将未跟踪的高速缓存添加到索引中或从索引中删除;当使用--[no-|force-]untracked-cache时,未跟踪的缓存会立即添加到索引中或从索引中删除。
在 2.17 之前,未跟踪的缓存有一个错误,将带有符号链接的目录替换到另一个目录可能会导致错误地将 git 跟踪的文件显示为未跟踪。请参阅“状态:添加一个显示 core.untrackedCache 错误的失败测试”提交到 git.git。解决方法是(这可能适用于未来其他未发现的错误):
$ git -c core.untrackedCache=false status
当涉及到未跟踪缓存的内部结构时,此错误也被证明会影响用文件替换目录的非符号链接情况,但是没有报告导致错误“git status”输出的情况。
还有一些情况,在 2.17 之前由 git 版本编写的现有索引将引用不再存在的目录,可能导致许多“无法打开目录”警告打印在“git status”上。这些是以前默默丢弃的现有问题的新警告。
与上述错误一样,解决方案是一次性使用core.untrackedCache=false执行“git status”以清除剩余的坏数据。
文件系统监控
此功能旨在加速具有大型工作目录的 repos 的 git 操作。
它使 git 能够与文件系统监视器一起工作(参见 githooks [5] 的“fsmonitor-watchman”部分),它可以告知它已经修改了哪些文件。这使得 git 可以避免必须 lstat()每个文件来查找修改过的文件。
与未跟踪的缓存一起使用时,它可以通过避免扫描整个工作目录以查找新文件的成本来进一步提高性能。
如果要启用(或禁用)此功能,则使用core.fsmonitor配置变量(参见 git-config [1] )比使用git update-index选项更容易使用git update-index每个存储库,特别是如果您想在所使用的所有存储库中执行此操作,因为您可以在$HOME/.gitconfig中设置一次配置变量,并使其影响您触摸的所有存储库。
更改core.fsmonitor配置变量时,下次命令读取索引时,会在索引中添加或删除文件系统监视器。使用--[no-]fsmonitor时,会立即将文件系统监视器添加到索引中或从索引中删除。
组态
该命令用于表示core.filemode配置变量。如果您的存储库位于可执行位不可靠的文件系统上,则应将其设置为 false (请参阅 git-config [1] )。这会导致命令忽略文件系统中索引和文件模式中记录的文件模式的差异(如果它们仅在可执行位上不同)。在这样一个不幸的文件系统上,您可能需要使用 git update-index --chmod = 。
很相似,如果core.symlinks配置变量设置为 false (参见 git-config [1] ),则符号链接被检出为普通文件,并且此命令不会修改从符号链接到常规文件的记录文件模式。
该命令查看core.ignorestat配置变量。参见 _ 使用上面的“假设未改变”位 _ 部分。
该命令还会查看core.trustctime配置变量。当通过 Git 之外的某些东西定期修改 inode 更改时间(文件系统爬虫和备份系统使用 ctime 标记处理的文件)时,它会很有用(参见 git-config [1] )。
可以通过core.untrackedCache配置变量启用未跟踪的高速缓存扩展(参见 git-config [1] )。
也可以看看
git-config [1] , git-add [1] , git-ls-files [1]
GIT
部分 git [1] 套件
git-update-ref
名称
git-update-ref - 安全地更新存储在 ref 中的对象名
概要
git update-ref [-m <reason>] [--no-deref] (-d <ref> [<oldvalue>] | [--create-reflog] <ref> <newvalue> [<oldvalue>] | --stdin [-z])
描述
给出两个参数,存储< newvalue>在< ref>中,可能取消引用符号引用。例如。 git update-ref HEAD <newvalue>将当前分支头更新为新对象。
给出三个参数,存储< newvalue>在< ref>中,在验证< ref>的当前值之后,可能解除引用符号引用。匹配< oldvalue>。例如。 git update-ref refs/heads/master <newvalue> <oldvalue>将主分支头更新为< newvalue>仅当其当前值为< oldvalue>时。您可以将 40“0”或空字符串指定为< oldvalue>确保您创建的引用不存在。
它还允许“ref”文件作为指向另一个 ref 文件的符号指针,方法是从“ref:”的四字节头文件序列开始。
更重要的是,它允许更新 ref 文件以遵循这些符号指针,无论它们是符号链接还是这些“常规文件符号引用”。它只跟随真实符号链接,如果它们以“refs /”开头:否则它只会尝试读取它们并将它们更新为常规文件(即它将允许文件系统跟随它们,但会覆盖它们符号链接到其他具有常规文件名的地方)。
如果给出了–no-deref,则< ref>本身被覆盖,而不是遵循符号指针的结果。
一般来说,使用
git update-ref HEAD "$head"
应该是 _ 很多 _ 比做更安全
echo "$head" > "$GIT_DIR/HEAD"
从符合条件的符号链接和两者都是错误检查的立场。符号链接的“refs /”规则意味着指向树“外部”的符号链接是安全的:它们将被用于读取但不用于写入(因此我们永远不会通过 ref 符号链接写入其他树,如果您已通过创建符号链接树复制了整个存档。
使用-d标志,它将删除命名的< ref>验证后仍然包含< oldvalue>。
使用--stdin,update-ref 从标准输入读取指令并一起执行所有修改。指定表单的命令:
update SP <ref> SP <newvalue> [SP <oldvalue>] LF create SP <ref> SP <newvalue> LF delete SP <ref> [SP <oldvalue>] LF verify SP <ref> [SP <oldvalue>] LF option SP <opt> LF
使用--create-reflog,update-ref 将为每个 ref 创建一个 reflog,即使通常不会创建一个。
引用包含空格的字段,就好像它们是 C 源代码中的字符串一样;即,被双引号包围并带有反斜杠逃逸。使用 40“0”字符或空字符串指定零值。要指定缺失值,请完全省略该值及其前面的 SP。
或者,使用-z以 NUL 终止格式指定,而不引用:
update SP <ref> NUL <newvalue> NUL [<oldvalue>] NUL create SP <ref> NUL <newvalue> NUL delete SP <ref> NUL [<oldvalue>] NUL verify SP <ref> NUL [<oldvalue>] NUL option SP <opt> NUL
在此格式中,使用 40“0”指定零值,并使用空字符串指定缺失值。
无论使用哪种格式,都可以以 Git 识别为对象名称的任何形式指定值。任何其他格式的命令或重复的< ref>产生错误。命令含义是:
update
设置< ref>到< newvalue>在验证< oldvalue>之后,如果给出。指定零< newvalue>确保更新后 ref 不存在和/或零< oldvalue>确保在更新之前 ref 不存在。
create
创建< ref>与< newvalue>在验证它不存在之后。给定的< newvalue>可能不是零。
delete
删除< ref>在验证它与< oldvalue>存在之后,如果给出。如果给出,< oldvalue>可能不是零。
verify
验证< ref>反对< oldvalue>但不要改变它。如果< oldvalue>零或缺少,ref 必须不存在。
option
修改命名< ref>的下一个命令的行为。唯一有效的选项是no-deref,以避免取消引用符号引用。
如果可以同时使用匹配的< oldvalue>来锁定所有< ref>,则执行所有修改。否则,不执行任何修改。注意,虽然每个人< ref>以原子方式更新或删除,并发读者仍可以看到修改的子集。
记录更新
如果 config 参数“core.logAllRefUpdates”为 true 且 ref 为 1,则为“refs / heads /”,“refs / remotes /”,“refs / notes /”或符号 ref HEAD;或文件“$ GIT_DIR / logs /< ref>”然后存在git update-ref将一行添加到日志文件“$ GIT_DIR / logs /< ref>” (在创建日志名称之前取消引用所有符号引用)描述 ref 值的更改。日志行的格式为:
oldsha1 SP newsha1 SP committer LF
其中“oldsha1”是先前存储在< ref>中的 40 字符十六进制值,“newsha1”是< newvalue>的 40 字符十六进制值。 “committer”是标准 Git committer ident 格式的提交者姓名,电子邮件地址和日期。
可选地使用-m:
oldsha1 SP newsha1 SP committer TAB message LF
其中所有字段如上所述,“message”是提供给-m 选项的值。
如果当前用户无法创建新日志文件,附加到现有日志文件或没有可用的提交者信息,则更新将失败(不更改< ref>)。
GIT
部分 git [1] 套件
git-verify-pack
名称
git-verify-pack - 验证打包的 Git 存档文件
概要
git verify-pack [-v|--verbose] [-s|--stat-only] [--] <pack>.idx …
描述
读取给定的 idx 文件,用于使用 git pack-objects 命令创建的打包 Git 存档,并验证 idx 文件和相应的包文件。
OPTIONS
<pack>.idx …
要验证的 idx 文件。
-v
--verbose
验证包后,显示包中包含的对象列表和 delta 链长度的直方图。
-s
--stat-only
不要验证包装内容;仅显示三角链长度的直方图。使用--verbose,还会显示对象列表。
--
不要将任何更多的参数解释为选项。
输出格式
指定-v 选项时,使用的格式为:
SHA-1 type size size-in-packfile offset-in-packfile
对于未在包中进行分层的对象,以及
SHA-1 type size size-in-packfile offset-in-packfile depth base-SHA-1
对于已经完成的对象。
GIT
部分 git [1] 套件
git-write-tree
名称
git-write-tree - 从当前索引创建树对象
概要
git write-tree [--missing-ok] [--prefix=<prefix>/]
描述
使用当前索引创建树对象。新树对象的名称将打印到标准输出。
索引必须处于完全合并状态。
从概念上讲, git write-tree sync()将当前索引内容转换为一组树文件。为了使你的目录中实际存在的匹配,你需要在 git write-tree 之前完成 git update-index 阶段。
OPTIONS
--missing-ok
通常 git write-tree 确保目录引用的对象存在于对象数据库中。此选项禁用此检查。
--prefix=<prefix>/
写一个表示子目录<prefix>的树对象。这可用于为命名子目录中的子项目编写树对象。
GIT
部分 git [1] 套件