Git 中文参考(八)

2024-06-26 19:23:48 浏览数 (3)

原文:Git Reference 协议:CC BY-NC-SA 4.0

git-show-ref

原文: git-scm.com/docs/git-show-ref

名称

git-show-ref - 列出本地存储库中的引用

概要

代码语言:javascript复制
git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference]
	     [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
	     [--heads] [--] [<pattern>…​]
git show-ref --exclude-existing[=<pattern>]

描述

显示本地存储库中可用的引用以及关联的提交 ID。可以使用模式过滤结果,并且可以将标记解除引用到对象 ID 中。此外,它还可用于测试特定引用是否存在。

默认情况下,显示标签,磁头和远程参考。

–exclude-existing 表单是一个反向的过滤器。它从 stdin 读取 refs,每行一个 ref,并显示本地存储库中不存在的那些。

鼓励使用此实用程序,以便直接访问.git目录下的文件。

OPTIONS

代码语言:javascript复制
 --head 

显示 HEAD 引用,即使它通常会被过滤掉。

代码语言:javascript复制
 --heads 
代码语言:javascript复制
 --tags 

分别限于“refs / heads”和“refs / tags”。这些选择并不相互排斥;当给出两者时,显示存储在“refs / heads”和“refs / tags”中的引用。

代码语言:javascript复制
 -d 
代码语言:javascript复制
 --dereference 

取消引用标记到对象 ID 中。它们将显示为附加“^ {}”。

代码语言:javascript复制
 -s 
代码语言:javascript复制
 --hash[=<n>] 

仅显示 SHA-1 哈希值,而不是引用名称。与–dereference 结合使用时,仍会在 SHA-1 之后显示解除引用的标记。

代码语言:javascript复制
 --verify 

通过要求精确的 ref 路径来启用更严格的引用检查。除了返回错误代码 1 之外,如果未指定--quiet,它还将打印错误消息。

代码语言:javascript复制
 --abbrev[=<n>] 

缩写对象名称。使用--hash时,您不必说--hash --abbrev; --hash=n会这样做。

代码语言:javascript复制
 -q 
代码语言:javascript复制
 --quiet 

不要将任何结果打印到 stdout。与--verify结合使用时,可以用于静默检查是否存在引用。

代码语言:javascript复制
 --exclude-existing[=<pattern>] 

Make git show-ref 充当从“^(?:&lt;anything&gt;s)?&lt;refname&gt;(?:^{})?$”形式的 stdin 读取 refs 的过滤器,并对每个执行以下操作:(1)在行尾添加“^ {}”如果有的话(2)忽略是否提供了模式并且不匹配 refname; (3)警告 refname 不是格式良好的 refname 并跳过; (4)忽略 refname 是否是本地存储库中存在的 ref; (5)否则输出该行。

代码语言:javascript复制
 <pattern>…​ 

显示与一个或多个模式匹配的引用。模式从全名的末尾匹配,并且仅匹配完整的部分,例如, master 匹配 refs / heads / masterrefs / remotes / origin / masterrefs / tags / jedi / master 但不 refs / heads / mymasterrefs / remotes / master / jedi

OUTPUT

输出格式为:< SHA-1 ID> < space> <参考名称>

代码语言:javascript复制
$ git show-ref --head --dereference
832e76a9899f560a90ffd62ae2ce83bbeff58f54 HEAD
832e76a9899f560a90ffd62ae2ce83bbeff58f54 refs/heads/master
832e76a9899f560a90ffd62ae2ce83bbeff58f54 refs/heads/origin
3521017556c5de4159da4615a39fa4d5d2c279b5 refs/tags/v0.99.9c
6ddc0964034342519a87fe013781abf31c6db6ad refs/tags/v0.99.9c^{}
055e4ae3ae6eb344cbabf2a5256a49ea66040131 refs/tags/v1.0rc4
423325a2d24638ddcc82ce47be5e40be550f4507 refs/tags/v1.0rc4^{}
...

当使用–hash(而不是–dereference)时,输出格式为:< SHA-1 ID>

代码语言:javascript复制
$ git show-ref --heads --hash
2e3ba0114a1f52b47df29743d6915d056be13278
185008ae97960c8d551adcd9e23565194651b5d1
03adf42c988195b50e1a1935ba5fcbc39b2b029b
...

例子

要显示所有称为“master”的引用,无论是标记还是标题或其他任何内容,并且无论它们的引用命名层次结构有多深,请使用:

代码语言:javascript复制
	git show-ref master

如果存在这样的引用,这将显示“refs / heads / master”以及“refs / remote / other-repo / master”。

使用--verify标志时,该命令需要一个确切的路径:

代码语言:javascript复制
	git show-ref --verify refs/heads/master

只会匹配名为“master”的确切分支。

如果没有匹配, git show-ref 将返回错误代码 1,并且在验证的情况下,它将显示错误消息。

对于脚本,你可以要求它安静地使用“–quiet”标志,它可以让你做类似的事情

代码语言:javascript复制
	git show-ref --quiet --verify -- "refs/heads/$headname" ||
		echo "$headname is not a valid branch"

检查特定分支是否存在(请注意我们实际上不想显示任何结果,并且我们希望使用完整的 refname 以便不会触发模糊部分匹配的问题)。

要仅显示标记或仅显示正确的分支头,请分别使用“–tags”和/或“–heads”(使用两者表示它显示标记和头部,但不显示 refs /子目录下的其他随机引用)。

要进行自动标记对象解除引用,请使用“-d”或“–dereference”标志,这样就可以了

代码语言:javascript复制
	git show-ref --tags --dereference

获取所有标签的列表以及它们取消引用的内容。

FILES

.git/refs/*.git/packed-refs

也可以看看

git-for-each-ref [1] , git-ls-remote [1] , git-update-ref [1] , gitrepository-layout [5]

GIT

部分 git [1] 套件

git-symbolic-ref

原文: git-scm.com/docs/git-symbolic-ref

名称

git-symbolic-ref - 读取,修改和删除符号引用

概要

代码语言:javascript复制
git symbolic-ref [-m <reason>] <name> <ref>
git symbolic-ref [-q] [--short] <name>
git symbolic-ref --delete [-q] <name>

描述

给定一个参数,读取给定符号 ref 的哪个分支头指向并输出其相对于.git/目录的路径。通常,您会将HEAD作为< name>查看工作树所在分支的参数。

给定两个参数,创建或更新符号引用< name>指向给定分支< ref>。

给定--delete和另一个参数,删除给定的符号引用。

符号引用是一个常规文件,用于存储以ref: refs/开头的字符串。例如,您的.git/HEAD是一个常规文件,其内容为ref: refs/heads/master

OPTIONS

代码语言:javascript复制
 -d 
代码语言:javascript复制
 --delete 

删除符号 ref< name>。

代码语言:javascript复制
 -q 
代码语言:javascript复制
 --quiet 

如果< name&gt ;,请不要发出错误消息不是一个象征性的参考,而是一个独立的 HEAD;而是以静默方式退出非零状态。

代码语言:javascript复制
 --short 

显示< name>的值时作为一个象征性的参考,试图缩短价值,例如从refs/heads/mastermaster

代码语言:javascript复制
 -m 

更新< name>的 reflog 与< reason>。这仅在创建或更新符号引用时有效。

笔记

在过去,.git/HEAD是指向refs/heads/master的符号链接。当我们想切换到另一个分支时,我们做了ln -sf refs/heads/newbranch .git/HEAD,当我们想知道我们在哪个分支时,我们做了readlink .git/HEAD。但是符号链接不是完全可移植的,因此它们现在已被弃用,并且默认情况下使用符号引用(如上所述)。

如果符号引用的内容被正确打印,则 git symbolic-ref 将以状态 0 退出,如果请求的名称不是符号引用,则状态为 1;如果发生另一个错误,则为 128。

GIT

部分 git [1] 套件

git-update-index

原文: git-scm.com/docs/git-update-index

名称

git-update-index - 将工作树中的文件内容注册到索引

概要

代码语言:javascript复制
git update-index
	     [--add] [--remove | --force-remove] [--replace]
	     [--refresh] [-q] [--unmerged] [--ignore-missing]
	     [(--cacheinfo <mode>,<object>,<file>)…​]
	     [--chmod=( |-)x]
	     [--[no-]assume-unchanged]
	     [--[no-]skip-worktree]
	     [--[no-]fsmonitor-valid]
	     [--ignore-submodules]
	     [--[no-]split-index]
	     [--[no-|test-|force-]untracked-cache]
	     [--[no-]fsmonitor]
	     [--really-refresh] [--unresolve] [--again | -g]
	     [--info-only] [--index-info]
	     [-z] [--stdin] [--index-version <n>]
	     [--verbose]
	     [--] [<file>…​]

描述

修改索引或目录高速缓存。提到的每个文件都被更新到索引中,并且任何 _ 未合并 _ 或 _ 需要更新 _ 状态被清除。

另请参阅 git-add [1] ,以便以更加用户友好的方式对索引执行一些最常见的操作。

git update-index 处理文件的方式可以使用各种选项进行修改:

OPTIONS

代码语言:javascript复制
 --add 

如果指定的文件不在索引中,则添加它。默认行为是忽略新文件。

代码语言:javascript复制
 --remove 

如果指定的文件在索引中但缺少,则将其删除。默认行为是忽略已删除的文件。

代码语言:javascript复制
 --refresh 

查看当前索引并通过检查 stat()信息来检查是否需要合并或更新。

代码语言:javascript复制
 -q 

安静。如果–refresh 发现索引需要更新,则默认行为是错误输出。无论如何,此选项使 git update-index 继续。

代码语言:javascript复制
 --ignore-submodules 

不要尝试更新子模块。只有在–refresh 之前传递时才会遵循此选项。

代码语言:javascript复制
 --unmerged 

如果–refresh 在索引中找到未合并的更改,则默认行为是错误输出。无论如何,此选项使 git update-index 继续。

代码语言:javascript复制
 --ignore-missing 

在–refresh 期间忽略丢失的文件

代码语言:javascript复制
 --cacheinfo <mode>,<object>,<path> 
代码语言:javascript复制
 --cacheinfo <mode> <object> <path> 

直接将指定的信息插入索引。为了向后兼容,您还可以将这三个参数作为三个单独的参数提供,但鼓励新用户使用单参数表单。

代码语言:javascript复制
 --index-info 

从 stdin 读取索引信息。

代码语言:javascript复制
 --chmod=( |-)x 

设置更新文件的执行权限。

代码语言:javascript复制
 --[no-]assume-unchanged 

指定此标志时,不会更新为路径记录的对象名称。相反,此选项设置/取消设置路径的“假定未更改”位。当“假设未更改”位打开时,用户承诺不更改文件并允许 Git 假定工作树文件与索引中记录的文件匹配。如果要更改工作树文件,则需要取消设置该位以告知 Git。当在具有非常慢的 lstat(2)系统调用(例如 cifs)的文件系统上处理大项目时,这有时是有用的。

如果需要在索引中修改此文件,Git 将失败(优雅地),例如合并时提交;因此,如果上游更改了假定未跟踪文件,则需要手动处理该情况。

代码语言:javascript复制
 --really-refresh 

--refresh类似,但无条件地检查统计信息,而不考虑“假定未更改”设置。

代码语言:javascript复制
 --[no-]skip-worktree 

指定其中一个标志时,不会更新为路径记录的对象名称。相反,这些选项设置和取消设置路径的“skip-worktree”位。有关详细信息,请参阅下面的“跳过工作树位”部分。

代码语言:javascript复制
 --[no-]fsmonitor-valid 

指定其中一个标志时,不会更新为路径记录的对象名称。相反,这些选项设置和取消设置路径的“fsmonitor valid”位。有关详细信息,请参阅下面的“文件系统监视器”部分

代码语言:javascript复制
 -g 
代码语言:javascript复制
 --again 

在索引条目与HEAD提交的索引条目不同的路径上运行 git update-index 本身。

代码语言:javascript复制
 --unresolve 

如果意外清除,则恢复 _ 未合并 _ 或 _ 需要在合并期间更新文件的 _ 状态。

代码语言:javascript复制
 --info-only 

不要在对象数据库中为所有< file>创建对象跟随这面旗帜的论据;只需将其对象 ID 插入索引即可。

代码语言:javascript复制
 --force-remove 

即使工作目录仍有这样的文件,也要从索引中删除该文件。 (意味着 - 删除。)

代码语言:javascript复制
 --replace 

默认情况下,当索引中存在文件path时, git update-index 拒绝添加path/file的尝试。同样,如果存在文件path/file,则无法添加文件path。使用–replace 标志,将自动删除与添加的条目冲突的现有条目以及警告消息。

代码语言:javascript复制
 --stdin 

而不是从命令行获取路径列表,从标准输入中读取路径列表。默认情况下,路径由 LF(即每行一个路径)分隔。

代码语言:javascript复制
 --verbose 

报告从索引中添加和删除的内容。

代码语言:javascript复制
 --index-version <n> 

将结果索引写入指定的磁盘格式版本。支持的版本为 2,3 和 4.当前默认版本为 2 或 3,具体取决于是否使用了额外功能,例如git add -N

版本 4 执行简单的路径名压缩,在大型存储库上将索引大小减少 30%-50%,从而加快了加载时间。版本 4 相对年轻(2012 年 10 月首次发布于 1.8.0)。其他 Git 实现(如 JGit 和 libgit2)可能还不支持它。

代码语言:javascript复制
 -z 

仅对--stdin--index-info有意义;路径用 NUL 字符而不是 LF 分隔。

代码语言:javascript复制
 --split-index 
代码语言:javascript复制
 --no-split-index 

启用或禁用拆分索引模式。如果已启用拆分索引模式并再次给出--split-index,则$ GIT_DIR / index 中的所有更改都将推回到共享索引文件。

无论core.splitIndex配置变量的值如何,这些选项都会生效(参见 git-config [1] )。但是当更改违反配置值时会发出警告,因为配置的值将在下次读取索引时生效,这将消除该选项的预期效果。

代码语言:javascript复制
 --untracked-cache 
代码语言:javascript复制
 --no-untracked-cache 

启用或禁用未跟踪的缓存功能。请在启用之前使用--test-untracked-cache

无论core.untrackedCache配置变量的值如何,这些选项都会生效(参见 git-config [1] )。但是当更改违反配置值时会发出警告,因为配置的值将在下次读取索引时生效,这将消除该选项的预期效果。

代码语言:javascript复制
 --test-untracked-cache 

仅对工作目录执行测试以确保可以使用未跟踪的缓存。如果您真的想使用它,则必须使用--untracked-cache--force-untracked-cachecore.untrackedCache配置变量手动启用未跟踪的缓存。如果测试失败,则退出代码为 1,并且消息说明根据需要不起作用的内容,否则退出代码为 0 并打印 OK。

代码语言:javascript复制
 --force-untracked-cache 

--untracked-cache相同。提供与旧版 Git 的向后兼容性,其中--untracked-cache曾暗示--test-untracked-cache,但此选项将无条件地启用扩展。

代码语言:javascript复制
 --fsmonitor 
代码语言:javascript复制
 --no-fsmonitor 

启用或禁用文件系统监视器功能。无论core.fsmonitor配置变量的值如何,这些选项都会生效(参见 git-config [1] )。但是当更改违反配置值时会发出警告,因为配置的值将在下次读取索引时生效,这将消除该选项的预期效果。

代码语言:javascript复制
 -- 

不要将任何更多的参数解释为选项。

代码语言:javascript复制
 <file> 

要采取行动的文件。请注意以 _ 开头的文件。_ 被丢弃。这包括./filedir/./file。如果您不想这样,那么使用更干净的名称。结束 / 的目录和 // 的路径也是如此

使用–REFRESH

--refresh不计算新的 sha1 文件或使模式/内容更改的索引更新。但是做的是将文件的统计信息与索引“重新匹配”,以便您可以刷新尚未更改的文件的索引但是 stat 条目的位置是过时了。

例如,你想在执行 git read-tree 之后执行此操作,将 stat 索引详细信息与正确的文件链接起来。

使用–CACHEINFO 或–INFO-ONLY

--cacheinfo用于注册不在当前工作目录中的文件。这对于最小检出合并非常有用。

假装你在模式和 sha1 的路径上有一个文件,说:

代码语言:javascript复制
$ git update-index --add --cacheinfo <mode>,<sha1>,<path>

--info-only用于注册文件而不将它们放在对象数据库中。这对仅状态存储库很有用。

--cacheinfo--info-only的行为类似:索引已更新,但对象数据库未更新。当对象在数据库中但文件在本地不可用时,--cacheinfo很有用。当文件可用时,--info-only很有用,但您不希望更新对象数据库。

使用–INDEX-INFO

--index-info是一种更强大的机制,允许您从标准输入中提供多个条目定义,并专门为脚本设计。它可以采用三种格式的输入:

  1. 模式 SP 类型 SP sha1 TAB 路径 这种格式是将git ls-tree输出填充到索引中。
  2. 模式 SP sha1 SP 阶段 TAB 路径 这种格式是将更高阶的阶段放入索引文件中,并匹配 git ls-files --stage 输出。
  3. 模式 SP sha1 TAB 路径 任何 Git 命令都不再生成此格式,但update-index --index-info将继续支持此格式。

要为索引放置更高的阶段条目,首先应通过为路径提供 mode = 0 条目,然后以第三种格式提供必要的输入行来删除路径。

例如,从这个索引开始:

代码语言:javascript复制
$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz

您可以将以下输入提供给--index-info

代码语言:javascript复制
$ git update-index --index-info
0 0000000000000000000000000000000000000000	frotz
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1	frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2	frotz

输入的第一行输入 0 作为删除路径的模式;只要格式良好,SHA-1 无关紧要。然后第二行和第三行为该路径提供阶段 1 和阶段 2 条目。在上述之后,我们最终会得到:

代码语言:javascript复制
$ 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 --indexgit checkout-index -ugit read-tree -u )自动标记为“假设不变”。注意,如果git update-index --refresh发现工作树文件与索引匹配,则“假定未更改”位为而不是设置(如果要将它们标记为“假设未更改”,请使用git update-index --really-refresh)。

例子

要仅更新和刷新已检出的文件:

代码语言:javascript复制
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
代码语言:javascript复制
 On an inefficient filesystem with core.ignorestat set 
代码语言:javascript复制
$ 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
  1. 强制 lstat(2)为匹配索引的路径设置“假定未更改”位。
  2. 标记要编辑的路径。
  3. 这样做 lstat(2)并找到索引匹配路径。
  4. 这样做 lstat(2)并找到索引而不是匹配路径。
  5. 将新版本注册到索引集“假定未更改”位。
  6. 并假设不变。
  7. 即使你编辑它。
  8. 你可以告诉我事后的变化。
  9. 现在它检查 lstat(2)并发现它已被更改。

SKIP-WORKTREE BIT

Skip-worktree 位可以在一个(长)句子中定义:当读取条目时,如果它被标记为 skip-worktree,那么 Git 假装其工作目录版本是最新的并且改为读取索引版本。

详细说明,“阅读”意味着检查文件是否存在,读取文件属性或文件内容。工作目录版本可能存在或不存在。如果存在,其内容可能与索引版本匹配。写入不受此位影响,内容安全仍然是第一优先。请注意,Git _ 可以 _ 更新工作目录文件,标记为 skip-worktree,如果安全的话(即工作目录版本与索引版本匹配)

虽然这个位看起来类似于假设未改变的位,但它的目标与假设未改变的位不同。当两者都设置时,Skip-worktree 也优先于假定未更改的位。

分裂指数

此模式适用于具有非常大索引的存储库,旨在减少重复编写这些索引所需的时间。

在此模式下,索引分为两个文件: GIT_DIR / index 和 GIT_DIR / sharedindex。< SHA-1>。更改将在

当拆分索引中的条目数达到 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。解决方法是(这可能适用于未来其他未发现的错误):

代码语言:javascript复制
$ 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-scm.com/docs/git-update-ref

名称

git-update-ref - 安全地更新存储在 ref 中的对象名

概要

代码语言:javascript复制
git update-ref [-m <reason>] [--no-deref] (-d <ref> [<oldvalue>] | [--create-reflog] <ref> <newvalue> [<oldvalue>] | --stdin [-z])

描述

给出两个参数,存储< newvalue>在< ref>中,可能取消引用符号引用。例如。 git update-ref HEAD &lt;newvalue&gt;将当前分支头更新为新对象。

给出三个参数,存储< newvalue>在< ref>中,在验证< ref>的当前值之后,可能解除引用符号引用。匹配< oldvalue>。例如。 git update-ref refs/heads/master &lt;newvalue&gt; &lt;oldvalue&gt;将主分支头更新为< newvalue>仅当其当前值为< oldvalue>时。您可以将 40“0”或空字符串指定为< oldvalue>确保您创建的引用不存在。

它还允许“ref”文件作为指向另一个 ref 文件的符号指针,方法是从“ref:”的四字节头文件序列开始。

更重要的是,它允许更新 ref 文件以遵循这些符号指针,无论它们是符号链接还是这些“常规文件符号引用”。它只跟随真实符号链接,如果它们以“refs /”开头:否则它只会尝试读取它们并将它们更新为常规文件(即它将允许文件系统跟随它们,但会覆盖它们符号链接到其他具有常规文件名的地方)。

如果给出了–no-deref,则< ref>本身被覆盖,而不是遵循符号指针的结果。

一般来说,使用

代码语言:javascript复制
git update-ref HEAD "$head"

应该是 _ 很多 _ 比做更安全

代码语言:javascript复制
echo "$head" > "$GIT_DIR/HEAD"

从符合条件的符号链接两者都是错误检查的立场。符号链接的“refs /”规则意味着指向树“外部”的符号链接是安全的:它们将被用于读取但不用于写入(因此我们永远不会通过 ref 符号链接写入其他树,如果您已通过创建符号链接树复制了整个存档。

使用-d标志,它将删除命名的< ref>验证后仍然包含< oldvalue>。

使用--stdin,update-ref 从标准输入读取指令并一起执行所有修改。指定表单的命令:

代码语言:javascript复制
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 终止格式指定,而不引用:

代码语言:javascript复制
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>产生错误。命令含义是:

代码语言:javascript复制
 update 

设置< ref>到< newvalue>在验证< oldvalue>之后,如果给出。指定零< newvalue>确保更新后 ref 不存在和/或零< oldvalue>确保在更新之前 ref 不存在。

代码语言:javascript复制
 create 

创建< ref>与< newvalue>在验证它不存在之后。给定的< newvalue>可能不是零。

代码语言:javascript复制
 delete 

删除< ref>在验证它与< oldvalue>存在之后,如果给出。如果给出,< oldvalue>可能不是零。

代码语言:javascript复制
 verify 

验证< ref>反对< oldvalue>但不要改变它。如果< oldvalue>零或缺少,ref 必须不存在。

代码语言:javascript复制
 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将一行添加到日志文件“

代码语言:javascript复制
oldsha1 SP newsha1 SP committer LF

其中“oldsha1”是先前存储在< ref>中的 40 字符十六进制值,“newsha1”是< newvalue>的 40 字符十六进制值。 “committer”是标准 Git committer ident 格式的提交者姓名,电子邮件地址和日期。

可选地使用-m:

代码语言:javascript复制
oldsha1 SP newsha1 SP committer TAB message LF

其中所有字段如上所述,“message”是提供给-m 选项的值。

如果当前用户无法创建新日志文件,附加到现有日志文件或没有可用的提交者信息,则更新将失败(不更改< ref>)。

GIT

部分 git [1] 套件

git-verify-pack

原文: git-scm.com/docs/git-verify-pack

名称

git-verify-pack - 验证打包的 Git 存档文件

概要

代码语言:javascript复制
git verify-pack [-v|--verbose] [-s|--stat-only] [--] <pack>.idx …​

描述

读取给定的 idx 文件,用于使用 git pack-objects 命令创建的打包 Git 存档,并验证 idx 文件和相应的包文件。

OPTIONS

代码语言:javascript复制
 <pack>.idx …​ 

要验证的 idx 文件。

代码语言:javascript复制
 -v 
代码语言:javascript复制
 --verbose 

验证包后,显示包中包含的对象列表和 delta 链长度的直方图。

代码语言:javascript复制
 -s 
代码语言:javascript复制
 --stat-only 

不要验证包装内容;仅显示三角链长度的直方图。使用--verbose,还会显示对象列表。

代码语言:javascript复制
 -- 

不要将任何更多的参数解释为选项。

输出格式

指定-v 选项时,使用的格式为:

代码语言:javascript复制
SHA-1 type size size-in-packfile offset-in-packfile

对于未在包中进行分层的对象,以及

代码语言:javascript复制
SHA-1 type size size-in-packfile offset-in-packfile depth base-SHA-1

对于已经完成的对象。

GIT

部分 git [1] 套件

git-write-tree

原文: git-scm.com/docs/git-write-tree

名称

git-write-tree - 从当前索引创建树对象

概要

代码语言:javascript复制
git write-tree [--missing-ok] [--prefix=<prefix>/]

描述

使用当前索引创建树对象。新树对象的名称将打印到标准输出。

索引必须处于完全合并状态。

从概念上讲, git write-tree sync()将当前索引内容转换为一组树文件。为了使你的目录中实际存在的匹配,你需要在 git write-tree 之前完成 git update-index 阶段。

OPTIONS

代码语言:javascript复制
 --missing-ok 

通常 git write-tree 确保目录引用的对象存在于对象数据库中。此选项禁用此检查。

代码语言:javascript复制
 --prefix=<prefix>/ 

写一个表示子目录&lt;prefix&gt;的树对象。这可用于为命名子目录中的子项目编写树对象。

GIT

部分 git [1] 套件

0 人点赞