如何通过已知哈希值查找Git对象的对象ID

6
我正在使用bfg清理我的Git仓库。为了获取要删除的大文件列表,我使用此脚本。然而,对于一些文件,我只想从仓库中删除它们的特定版本。

bfg有一个选项可以“去除具有指定Git对象ID的blob”。当我运行上述脚本时,我会得到列表中每个对象的哈希值。鉴于这个哈希值,我如何找到该特定对象的git对象id,以便我可以使用bfg删除它?
1个回答

4

这个脚本似乎已经列出了git对象id。

如果你想要清理特定的提交,你可以使用命令行“哪个提交有这个blob?”来检查特定的对象id是否属于该提交。

git log --all --pretty=format:%H -- <path> | \
 xargs -n1 -I% sh -c "git ls-tree % <path> | \
 grep -q <hash> && echo %"

例如,在我的repo seec中:

例如,在我的repo seec中:

a255b5c1d469591037e4eacd0d7f4599febf2574 12884 seec.go
a7320d8c0c3c38d1a40c63a873765e31504947ff 12928 seec.go

我想清除seec.goa7320d8版本;如在BFG 提交 12d1b00中所示:

人们可以使用“git rev-list --all --objects”获取blob-id列表,然后使用grep列出要删除的目录中的所有文件,并将其传递给BFG。

请注意:bi测试阅读:
val blobIdsFile = Path.createTempFile()
blobIdsFile.writeStrings(badBlobs.map(_.name()),"\n")
run(s"--strip-blobs-with-ids ${blobIdsFile.path}")

意思是-bi参数后跟着一个包含blob id的文件。


我也可以通过查找其提交来确认我刚刚获取的是否为blob id:

vonc@bvonc MINGW64 ~/data/git/seec (master)
$ git log --all --pretty=format:%H -- seec.go | xargs -n1 -I% sh -c "git ls-tree % seec.go|\
grep -q a7320d8 && echo %"

我得到:提交c084402

让我们看看这个提交是否确实包括seec.go修订blob id a7320d8(使用“Git - 查找索引中单个文件的SHA1”). 我可以从GitHub提交中找到文件的Blob ID:

vonc@bvonc MINGW64 ~/data/git/seec (master)
$ (echo -ne "blob $(curl -s https://raw.githubusercontent.com/VonC/seec/c084402/seec.go --stderr -|wc -c)\0"; \
   curl -s https://raw.githubusercontent.com/VonC/seec/c084402/seec.go --stderr -) | \
  sha1sum | awk '{ print $1 }'
a7320d8c0c3c38d1a40c63a873765e31504947ff

好的。

如果我想要剥离出seec.go blob id a7320d8,我知道可以将该blob id(在“blob ids”文件中)传递给bfg。


我链接的脚本中的哈希似乎是文件内容的SHA-1哈希值,而不是哈希ID,因此当我将其与bfg的“--strip-blobs-with-ids”选项一起使用时,它无法找到该文件。 - Chin
你链接的脚本是关于 Blob ID 的,因为我成功地从提交中获取了该脚本返回的 ID 所对应的 Blob ID。 - VonC
很奇怪,你说的对。在脚本中获得的哈希确实是对象ID本身(我执行了 git rev-list --all --objects | grep myFile 并在列表中看到了哈希)。然而,当我将该哈希传递给 BFG 使用 java -jar bfg-1.12.15.jar -bi 12345 时,它会显示错误信息:Error: Option --strip-blobs-with-ids failed when given '12345'. 12345(The system cannot find the file specified). (12345 是示例哈希) - Chin
@Chin,您可以在测试中看到该选项的使用:https://github.com/rtyley/bfg-repo-cleaner/blob/12d1b00bff6afdeb474a5194be4d0b19b2cc481b/src/test/scala/com/madgag/git/bfg/cli/MainSpec.scala#L64-L81。`--strip-blobs-with-ids ${blobIdsFile.path}`它需要一个包含 blob id 的文件。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接