如何使用已知哈希查找对象的git对象id

时间:2017-07-01 05:54:35

标签: git bfg-repo-cleaner

我正在使用bfg来清理我的git repo。要获取要删除的大文件列表,我使用this script。但是对于某些文件,我只想从repo中删除它们的特定版本。

bfg可以选择"使用指定的Git对象ID"去除blob。当我运行上面的脚本时,我会为列表中的每个对象提供一个哈希值。鉴于哈希,我怎样才能找到该特定对象的git对象id,以便我可以用bfg删除它?

1 个答案:

答案 0 :(得分:1)

该脚本似乎已经列出了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

我想要清除a7320d8seec.go;

如在BFG commit 12d1b00中所见:

  

人们可以使用获取blob-id列表   “git rev-list --all --objects”,然后grep列出他们想要核对的目录中的所有文件,并将其传递给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标识a7320d8(使用“Git - finding the SHA1 of an individual file in the index”)。
我可以从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,我知道我可以将bbg传递给blob id(在“blob ids”文件中)。