如何找到具有已知哈希值的对象的 git 对象 ID

How to find the git object id of an object with a known hash

我正在使用 bfg to clean my git repo. To get the list of big files to delete, I use this script。但是对于某些文件,我只想从存储库中删除它们的特定版本。

bfg 可以选择 "strip blobs with the specified Git object ids"。当我 运行 上面的脚本时,我得到了列表中每个对象的哈希值。鉴于该散列,我如何找出该特定对象的 git 对象 ID,以便我可以使用 bfg 将其删除?

该脚本似乎已经列出了 git 对象 ID。

如果您有一个特定的提交您有兴趣清理,您可以使用 command line "Which commit has this blob?" 检查特定的对象 ID 是否是所述提交的一部分。

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

例如,在我的 repo seec:

a255b5c1d469591037e4eacd0d7f4599febf2574 12884 seec.go
a7320d8c0c3c38d1a40c63a873765e31504947ff 12928 seec.go

我想清理 seec.goa7320d8 版本;

如 BFG 中所见 commit 12d1b00:

People can get a list of blob-ids using "git rev-list --all --objects", then grep to list all files in directories they want to nuke, and pass that to the BFG.

注:bi test 为:

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 %"

我得到:commit c084402.

让我们看看该提交是否确实包含 seec.go 修订版 blob id a7320d8(使用“Git - finding the SHA1 of an individual file in the index”)。
我可以从 GitHub commit:

中找到文件的 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)[=14=]"; \
   curl -s https://raw.githubusercontent.com/VonC/seec/c084402/seec.go --stderr -) | \
  sha1sum | awk '{ print  }'
a7320d8c0c3c38d1a40c63a873765e31504947ff

宾果。

我是否应该删除 seec.go blob id a7320d8,我知道我可以将那个 blob id 传递给 bfg(在 "blob ids" 文件中)。