GIT:获取通过提交添加到存储库的blob的所有GIT对象哈希

GIT:获取通过提交添加到存储库的blob的所有GIT对象哈希,git,git-plumbing,git-diff-tree,Git,Git Plumbing,Git Diff Tree,是否可以使用git命令行工具获取由给定提交哈希添加到存储库的blob的所有git对象哈希的列表 我已经尝试过用git管道工具git diff tree来归档这个文件。也许这是错误的方法。下面是迄今为止我能得到的最好结果。但是(很长的手册页)文档并没有帮助您了解输出的解释方式 $ git diff-tree --no-commit-id 2b53d04dbb7cd35d030ddc59b13c0836a87daeb7 :100644 100644 03f15b592c7d776da37e3d43

是否可以使用git命令行工具获取由给定提交哈希添加到存储库的blob的所有git对象哈希的列表

我已经尝试过用git管道工具
git diff tree
来归档这个文件。也许这是错误的方法。下面是迄今为止我能得到的最好结果。但是(很长的手册页)文档并没有帮助您了解输出的解释方式

$ git diff-tree --no-commit-id 2b53d04dbb7cd35d030ddc59b13c0836a87daeb7 
:100644 100644 03f15b592c7d776da37e3d4372c215b14ff8820f 6e0ed0b1ed56e9a35a3be52a9de261c8ffcccae8 M      file1.ts
:100644 100644 b5083bdb9c31005ebd16835a0f49dc848d3f387a 4b7f9e6624a66fec0510d76823303017e224c9d7 M      file2.ts
:100644 100644 368d64862e6aa2a0110f201c8a5193d929e2956d 0e51626a9866a8a3896489f497fbd745a5f4a9f2 M      file3.ts
:040000 040000 c332b1e576af0dbb93cc875106bc06c3de6b74c8 f7f3478a9b0eaac85719699d97e323563a1b102b M      some_folder
第一个和第二个git对象blob散列是否分别显示修改文件的旧对象和新对象?在最坏的情况下,我可以通过解析输出来获取该信息

我的主要目标是找到一个如下所示的命令行:

$ git <command> <option1> <option2> 368d64862e6aa2a0110f201c8a5193d929e2956d 
6e0ed0b1ed56e9a35a3be52a9de261c8ffcccae8 
4b7f9e6624a66fec0510d76823303017e224c9d7 
0e51626a9866a8a3896489f497fbd745a5f4a9f2 
C:
commit
B:
blob

如果不容易做到这一点,可以做两次传球。在第一遍中,由于您指出的原因,BLOB可以在不同的提交中多次提到:

  • 在其他文件中添加具有相同内容的文件
  • 文件修改后具有相同的内容
然后我可以再次通过管道将文件传递到
awk'!x[$0]+'
将删除任何重复项。这将不是很有效,但会得到我想要的结果

我希望我现在把我的意图说清楚了。有什么想法吗

是否可以使用git命令行工具获取由给定提交哈希添加到存储库的blob的所有git对象哈希的列表

是和/或否:您必须准确定义添加到存储库的含义

例如,假设我从一个完全空的存储库开始:

$ mkdir foo && cd foo && git init
Initialized empty Git repository in ...
现在我创建
README.md
git添加
并提交:

$ echo for testing > README.md
$ git add README.md
$ git commit -m initial
[master (root-commit) 19278e9] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
README.md
是一个blob,其哈希ID为:

$ git rev-parse HEAD:README.md
43b18adf702be62761e3affd85c4c3ee5c396be7
稍后,我将编写一个新文件:

$ echo for testing > newfile.txt
$ git add newfile.txt
$ git commit -m 'add new file'
[master 5521a02] add new file
 1 file changed, 1 insertion(+)
 create mode 100644 newfile.txt
如果我们查看此提交,我们将看到新文件。如果我们使用
git show--raw查看它,我们将在
git diff树中看到它
格式:

$ git show --raw
commit 5521a02ce1bc4f147d0fa39a178512476764dd66 (HEAD -> master)
Author: Chris Torek <chris.torek gmail.com>
Date:   Fri Oct 18 14:10:55 2019 -0700

    add new file

:000000 100644 0000000 43b18ad A        newfile.txt
是的,这与
README.md
的哈希ID相同:

$ git ls-tree -r HEAD
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7    README.md
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7    newfile.txt
这是一个斑点,但有两个文件。这真的是新增加的吗

如果您对上述问题的回答是“是的,它是新的,即使它是旧的”,这可能会回答第二个问题。如果您的答案是“不,这不是新的”,那么重新引入在上一次提交中删除的blob的提交又如何呢?或者,如果在两个分支上并行进行两次提交
I
J

          I   <-- br1
         /
...--G--H
         \
          J   <-- br2

I取决于您将要编写的任何语言的可用内存量。您可以只运行
git rev list--reverse
来获取提交哈希列表,然后在该编程语言中,在每次提交时调用
git ls tree-r
,并获取所有blob哈希。如果你能在一个关联数组中保存所有的blob散列,现在这是一个简单的测试:
对于h(ls tree-r of c)//h是散列,c是提交
如果数组中的h{notnew}否则{array[h]=c;是新的}
请注意,
git rev list--reverse访问提交的顺序在文档中的规定非常松散。在非线性情况下,即在历史记录漫游期间在合并处分叉时,
git rev list
使用优先级队列。优先级取决于您指定的排序选项。默认为使用提交人日期
--topo order
保证您可以“一次完成”合并的每个分支,而不需要交错。谢谢您的时间。记忆不应该是个问题。(96GB)
$ git ls-tree -r HEAD
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7    README.md
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7    newfile.txt
          I   <-- br1
         /
...--G--H
         \
          J   <-- br2