扫描git对象以进行提交而无需 checkout

w8ntj3qf  于 2023-04-28  发布在  Git
关注(0)|答案(4)|浏览(129)

有没有一种方法可以不运行git checkout就读取所有与git commit相关的文件?中的一堆blob。git文件夹?有没有一种方法可以直接读取这些blob给一个提交id?还是运行git checkout更简单?我只是想审计文件的漏洞,如纯文本密码等。

nxowjjhe

nxowjjhe1#

为了查看一个对象(并在stdout上获取它),你可以这样做:

git show some-branch-or-revision:file-path
git cat-file -p object-id

这两个都行

prdp8dxp

prdp8dxp2#

...并查看提交使用中包含的文件列表

git ls-tree -r <commit id>

此列表将包含文件数据的blob id,因此您可以使用其他答案中提到的cat-file。

lbsnaicq

lbsnaicq3#

有一个git unpack-file $blob_id,它将blob内容的一个副本放在工作树根上,并打印一个垃圾名称。
还有git cat-file --batch,它采用可选格式和一些更多的调整,并通过管道传输所有请求的输出。如果您已经控制了审计工具的输入处理,那么这将是迄今为止最有效的:

git ls-files -s | cut -d' ' -f2- \
| git cat-file --batch='%(objectname) %(objectsize) %(rest)' \
| your audit tool

对于提交,它将从git ls-tree -r $thatcommit | cut -d' ' -f3-开始

gev0vcfq

gev0vcfq4#

另一种方法是Git 2。38(2022年第三季度):“git ls-files“(man)学习--format选项来调整其输出。
因此,jthillanswer使用:

  • git ls-files -s | cut -d' ' -f2-获取每个文件提交
  • git cat-file --batch='%(objectname) %(objectsize) %(rest)'

你可以直接用Git 2来做。38+,前面是git unpack-file

git unpack-file $blob_id
git ls-files --format='%(path) %(objectname) %(objectsize)'

请参阅commit ce74de9(2022年7月23日)。
(由Junio C Hamano -- gitster --合并至commit 8e56aff,2022年8月3日)

ls-files:引入“--format”选项

签字人:胡哲宁
添加一个新选项“--format”,它以自定义格式输出索引条目信息,灵感来自git ls-treeman)命令中同名的选项。
--format”不能与“-s”、“-o”、“-k”、“-t”、“--resolve-undo”、“--deduplicate”和“--eol”一起使用。
git ls-files现在在其手册页中包括:

--format=<format>

从显示的结果中插入%(fieldname)的字符串。它还将%%内插到%,并将%xx内插到十六进制码为xx的字符,其中xx是十六进制数字;
例如,%00插值到\0(NUL),%09插值到\t(TAB),%0a插值到\n(LF)。
--format不能与-s-o-k-t--resolve-undo--eol组合使用。
git ls-files现在在其手册页中包括:
可以使用--format选项以自定义格式打印,该选项能够使用%(fieldname)符号插入不同的字段。
例如,如果您只关心“objectname”和“path”字段,则可以使用特定的“--format”执行,如
git ls-files --format='%(objectname)%(path)'

域名

每个路径的显示方式可以通过使用--format=<format>选项进行自定义,其中<format>字符串中用于索引条目各个方面的%(fieldname)被插值。
理解以下“字段名”:

objectmode

记录在索引中的文件的模式。

objectname

记录在索引中的文件的名称。

stage

记录在索引中的文件的阶段。

eolinfo:index

eolinfo:worktree

索引或路径工作树中内容的<eolinfo>(请参见--eol选项的说明)。

eolattr

适用于路径的<eolattr>(请参阅--eol选项的说明)。

path

记录在索引中的文件的路径名。
注意:如果您使用的是git ls-files --format="%(path)use Git 2.41 (Q2 2023)

相关问题