在git中,'cat-file'代表什么?

4ngedf3f  于 2022-11-20  发布在  Git
关注(0)|答案(5)|浏览(141)

在git中,cat-file在这个命令中代表什么?

$ git cat-file <...>

我首先想到的是“concatenate file”,因为Unix命令cat代表“concatenate”,但这与git cat-file的功能不对应。

f8rj6qna

f8rj6qna1#

add to @Matoeil答案,您只需指定<SHA1>的5个字符。

$ tree .git/

.git/
├── COMMIT_EDITMSG
├── HEAD
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           ├── master
│           └── testBranch
├── objects
│   ├── 1e
│   │   └── e2a78c0b40dd8e5c6b08e31171a3ce1e8d931b
│   ├── 29
│   │   └── 33b9017f79a27ff5ad3c4e154f67b44ae8482c
│   ├── 4a
│   │   └── 6a376085b9b3b8e6e73d2cdcc5281cf6915c58
│   ├── 4b
│   │   └── 825dc642cb6eb9a060e54bf8d69288fbee4904
│   ├── 7e
│   │   └── 6965a8b2ff07da3e632a24ee024b9d2ec5245d
│   ├── ae
│   │   └── 853f7ece778281c463c1f0c603ef9d47a425b7
│   ├── info
│   └── pack
└── refs
├── heads
│   ├── master
│   └── testBranch
└── tags

17 directories, 28 files

$ git cat-file -t ae853
tree 

$ git cat-file -p ae853
100644 blob 7e6965a8b2ff07da3e632a24ee024b9d2ec5245d    fil1.txt

here解释得很好。

jm81lzqq

jm81lzqq2#

git cat-file -Cat(concatenate)命令它从文件中读取数据并输出内容。

velaa5lx

velaa5lx3#

虽然cat确实代表“concatenate”,但它实际上只是按照cat的命令行参数中出现的顺序显示一个或多个文件。在Linux或 *nix系统上 * 查看 * 文件内容的常见模式是:

cat <file>

cat和Git的cat-file的主要区别在于它只显示一个文件(因此有-file部分)。它只是对cat命令行为的引用。
git-cat-file-提供存储库对象的内容或类型和大小信息
从技术上讲,如果您使用“批处理输出”模式,则可以使用git cat-file连接文件:

批次输出

如果给定--batch--batch-checkcat-file将从stdin读取对象,每行一个,并打印有关它们的信息。默认情况下,整行都被视为一个对象,就像它被馈送到git-rev-parse [1]一样。

c7rzv4ha

c7rzv4ha4#

读取git对象的内容(或blob)

git cat-file -p <SHA1>

读取其类型

git cat-file -t <SHA1>
cetgtptt

cetgtptt5#

cat和Git的cat-file的主要区别在于它只显示一个文件(因此有-file部分)
单个文件,...或list个单个文件。
在第二种形式中,在stdin上提供对象列表(由换行符分隔),并在stdout上打印每个对象的SHA-1、类型和大小。
可以使用可选的<format>参数覆盖输出格式。
当您考虑git cat-file --batch时,这一点非常重要,git cat-file --batch会打印stdin上提供的每个对象的对象信息和内容
另请参阅git cat-files --batch-command with Git 2.36 (Q2 2022)
随着Git 2.34(Q4 2021)的推出,驱动“git for-each-ref“(man)的“--format“选项的“ref-filter“机制和它的朋友们进化了,将被用于"git cat-file --batchman)"。
参见Junio C Hamano ( gitster )commit bff9703(2021年7月1日)。
请参见ZheNing Hu ( adlternative )commit b9dee07commit e85fcb3commit 7121c4dcommit bd0708ccommit 311d0b8(2021年7月26日)。
(2021年8月24日,由Junio C Hamano -- gitster --commit bda891e中合并)
第1001章:添加%(剩余)原子
审核人:雅各布·凯勒
建议人:雅各布·凯勒
推荐人:克里斯蒂安·库德
推荐人:哈里翁·维尔马
签署人:胡哲宁
%(rest)是用于cat文件批处理模式的原子,它可以在第一个空格边界处分割输入行,该空格之前的所有字符都被认为是对象名;在第一个空白字符之后的字符(即,该行的“剩余”)被输出以代替%(剩余)原子。
为了让“cat-file --batch=%(rest)“使用ref-filter接口,请为ref-filter添加%(rest)原子。
引入reject_atom()来拒绝原子%(rest),以表示“git for-each-ref“(man)、“git branch“(man)、“git tag“(man)和”git verify-tag“。
因此,两个命令应返回相同的结果:

git cat-file commit refs/tags/testtag^{} >expected &&
git for-each-ref --format="%(*raw)" refs/tags/testtag 

basic atom: refs/tags/testtag *raw

相同于:

git rev-parse refs/mytrees/first | git cat-file --batch >expected &&
git for-each-ref --format="%(objectname) %(objecttype) %(objectsize)%(raw)" refs/mytrees/first

请注意,在Git 2.36(2022年第二季度)中,“git cat-file --help“(man)更加清晰。
请参见第一次电子邮件发送的第24次电子邮件、第25次电子邮件(2022年1月10日)和第一次电子邮件发送的第26次电子邮件、第27次电子邮件、第28次电子邮件、第29次电子邮件、第30次电子邮件、第31次电子邮件、第32次电子邮件、第33次电子邮件、第34次电子邮件和第35次电子邮件(2021年12月28日)。
(由Junio C Hamano -- gitster --合并到commit 008028a,2022年2月5日)

  • ----纠正和改进使用信息
    签署人:埃瓦·阿恩菲约德·比贾马森
    更改“git cat-file“(man)-h上发出的用法输出,以分组相关选项,使用户清楚地了解哪些选项与哪些其他选项匹配。
    新输出为:
Check object existence or emit object contents
    -e                    check if <object> exists
    -p                    pretty-print <object> content

Emit [broken] object attributes
    -t                    show object type (one of 'blob', 'tree', 'commit', 'tag', ...)
    -s                    show object size
    --allow-unknown-type  allow -s and -t to work with broken/corrupt objects

Batch objects requested on stdin (or --batch-all-objects)
    --batch[=<format>]    show full <object> or <rev> contents
    --batch-check[=<format>]
                          like --batch, but don't emit <contents>
    --batch-all-objects   with --batch[-check]: ignores stdin, batches all known objects

Change or optimize batch output
    --buffer              buffer --batch output
    --follow-symlinks     follow in-tree symlinks
    --unordered           do not order objects before emitting them

Emit object (blob or tree) with conversion or filter (stand-alone, or with batch)
    --textconv            run textconv on object's content
    --filters             run filters on object's content
    --path blob|tree      use a <path> for (--textconv | --filters ); Not with 'batch'

旧用法为:

<type> can be one of: blob, tree, commit, tag
    -t                    show object type
    -s                    show object size
    -e                    exit with zero when there's no error
    -p                    pretty-print object's content
    --textconv            for blob objects, run textconv on object's content
    --filters             for blob objects, run filters on object's content
    --batch-all-objects   show all objects with --batch or --batch-check
    --path <blob>         use a specific path for --textconv/--filters
    --allow-unknown-type  allow -s and -t to work with broken/corrupt objects
    --buffer              buffer --batch output
    --batch[=<format>]    show info and content of objects fed from the standard input
    --batch-check[=<format>]
                          show info about objects fed from the standard input
    --follow-symlinks     follow in-tree symlinks (used with --batch or --batch-check)
    --unordered           do not order --batch-all-objects output

虽然较短,但我认为新的更容易理解,因为Eidogg.“X1 M28 N1 X“与“X1 M29 N1 X“和“X1 M30 N1 X“分组,因为它只能与这些选项组合。
对于“--buffer“、“--unordered“等也是如此。
仍然在Git 2.36(Q2 2022)中,优化掉strbuf_expand()调用,在git中使用cat-file”的--batch--batch-check选项,使用一个特定于默认格式的硬编码格式化逻辑。
参见commit eb54a33(2022年3月15日),作者John Cai ( john-cai )
(2022年3月23日,由Junio C Hamano -- gitster --commit 889860e中合并)

  • -跳过扩展默认格式
    签署人:埃瓦·阿恩菲约德·比贾马森
    签署人:蔡约翰
    当格式传递到--batch--batch-check--batch-command时,格式会展开。
    如果没有传入任何内容,则设置默认格式并调用expand_format()
    我们可以通过硬编码来保存这些周期,当没有传递任何格式或者传递了默认格式时,如何打印信息。
    默认情况下不需要完全展开的格式。
    由于batch_object_write()发生在批处理模式中提供的每个对象上,因此我们获得了很好的性能改进。
git rev-list --all > /tmp/all-obj.txt

git cat-file --batch-check </tmp/all-obj.txt

带有HEAD^:

Time (mean ± σ): 57.6 ms ± 1.7 ms [User: 51.5 ms, System: 6.2 ms] 
Range (min … max): 54.6 ms … 64.7 ms 50 runs

带有HEAD:

Time (mean ± σ): 49.8 ms ± 1.7 ms [User: 42.6 ms, System: 7.3 ms] 
Range (min … max): 46.9 ms … 55.9 ms 56 runs

如果未提供任何内容作为格式参数,或者如果传递了默认格式,则跳过格式的扩展,并使用默认格式打印对象信息。
请参阅this discussion
git cat-filescat:mail-mapping之间的另一个区别是:Map作者/提交者姓名和/或电子邮件地址的能力。
在Git 2.38(Q3 2022)中,“git cat-file“(man)学习了一个选项,可以在显示提交和标记对象时使用
mailmap

请参见Siddharth Asthana ( edith007 )commit 66a8a95commit dc88e34commit e9c1b0e(2022年7月19日),作者为Siddharth Asthana ( edith007 )
(由Junio C Hamano -- gitster --合并至commit 87098a0,2022年8月3日)
第1011章:添加mailmap支持
推荐人:克里斯蒂安·库德
推荐人:蔡约翰
帮助人:菲利普伍德
协助人:约翰内斯·申德林
签署人:悉达多·阿斯塔纳
git-cat-fileman)被GitLab之类的工具用来获取提交标签的内容,然后显示给用户。
具有作者、提交者或标记者信息的该内容在被发送或显示之前可以受益于通过mailmap机制。
此Patch将--[no-]use-mailmap指令行选项新增至git cat-file指令。
它还将--[no-]mailmap选项作为别名添加到--[no-]use-mailmap
git cat-file现在在其手册页中包括:

--[no-]mailmap的第一个字符串

--[no-]use-mailmap的第一个字符

使用mailmap文件将作者、提交者和标记者的姓名和电子邮件地址Map到规范的真实的姓名和电子邮件地址。请参阅git shortlog

相关问题