Git:如何在提交中列出更改的文件,包括每个文件 (blob) 的 SHA-1 哈希值?

标签 git

我想要的,总结:

我有一个提交,例如 HEAD111abc111,我想要一种优雅的方式来打印所有修改过的文件并且修改后的文件及其 SHA-1 哈希值。我该怎么做?

下面是一个使用 git-cat-file 的想法,几乎 可行,但它要么列出所有文件(包括未更改的文件),要么您必须使用它以批处理模式。在批处理模式下使用它最初看起来很有希望,但我无法让它工作。请参阅下文,了解我使用 git-ls-tree 等尝试过的事情。

关于我的优先事项的说明,请参阅下面的这个问题,或者查看我自己写的答案(我不会接受,但也许你可以重构它)。

具体示例:

设置示例:

作为背景,让我们看看我的 Git 工作树是什么样的:

$ ls

alice.txt
bob.c
carol.h
main.c

$ git status -s

# Nothing prints, the working copy is clean and untouched.

我现在两个文件:

$ echo "Add one line." >> bob.c

$ echo "Add one line." >> carol.h

$ git add .    # Add (stage) both changed files.

$ git status -s

M  bob.c
M  carol.h

$ git commit -m "Two changed files."

[master 111abc111] Two changed files.
 2 files changed, 2 insertions(+), 0 deletions(-)

这几乎是我想要的:

$ git cat-file -p 111abc111:./

100644 blob 99c2e88ad312f1eac63afc908f64c370fac9d947    .gitignore
100644 blob 607f8ea764981fb3f92a8d91abc2b154d99bc39c    alice.txt
100755 blob 5a297bd6931c1a70abbcab919815324258c08b0f    bob.c
100644 blob c6c2dfd18d26c1cf71b21e9d4c0892157dd6ec33    carol.h
100755 blob d0802cd238a3e83f186bc5c24be7e23dfc69205f    main.c

上面命令的问题在于它列出了指定路径中的所有内容,在本例中为 ./,即当前目录。它列出了每个文件,而不仅仅是修改过的文件。我只希望它显示 bob.ccarol.h

第二个问题是,使用 111abc111:./ 指定树状对象将只显示该目录中的文件(blob),不会显示子目录中的文件。子目录将显示如下:

040000 tree b98f38763b689e8197c6129726d41169fceeaaa0    subdir

可能的想法:

我只是删除了一些我尝试过的段落。

我怀疑 key 将使用 git-diff 来制作在指定提交中已更改的“git 对象”(包括 blob)列表,然后传递该“git 对象”列表"以某种格式保存到 git-cat-file。所以像这样的神奇命令可能会起作用:

$ git diff 111abc111^ 111abc111 --magic-options-go-here | git cat-file --batch-check='%(objectname) %(objectsize)'

关键是找到--magic-options-go-here 的值。我也不相信 git-cat-file 是我想要的管道字符右侧的内容,我可能想要其他内容。

谢谢。

编辑:我的优先事项

我对“git 对象”更感兴趣,它是存储在 Git 中并由 SHA-1 哈希值识别的实体,例如树、blob、提交,也许还有其他我没有想到的东西,例如标签。如果您对提交进行 checkout ,我对文件名以及文件系统中的实际外观不太感兴趣。

我想查看 SHA-1 哈希,这样我就可以看到“哦,这个 merge 提交从那边指向树的另一个分支。”通过在大型存储库中进行分支、 merge 和 rebase ,每个提交对象都包含大量未更改的树和 blob,它们只是指针(引用),它们所指的东西在概念上可能会非常遥远。当您仅更改一行,执行 git-commit,然后执行 git-push 并且推送的数据量为 50 MiB 时,这会变得很明显。在内部,Git 只需要取消对大量指针的引用并创建新的增量和包文件等等。工作目录(文件系统)中看似微小的变化实际上可能代表 Git 存储库二进制格式的大量数据。

最佳答案

就这么简单:

git show --stat --name-only 'YOUR_COMMIT_HASH'

关于Git:如何在提交中列出更改的文件,包括每个文件 (blob) 的 SHA-1 哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51963396/

相关文章:

Git 工作流问题 - 压缩提交和冲突

image - 将图像添加到 BitBucket 上的 README.md

git - 如何贡献给别人的存储库?

git - 是否可以将 git stash 推送到远程存储库?

Windows 10 CLI 终端上的 git log 输出编码问题

ios - 每当我尝试使用Git切换到另一个分支时,Xcode都会创建一个新分支?

node.js - npm - 发布具有多个版本的多个分支模块

git - 在不打开管理用户的情况下设置 git SSH 服务器

git - 打开 Git 提交编辑器到特定的光标位置

git - 如何使补丁忽略使用 "git apply"的文件索引?