6

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

bfg 可以选择“使用指定的 Git 对象 id 剥离 blob”。当我运行上面的脚本时,列表中的每个对象都会给我一个哈希值。鉴于该哈希,我如何找出该特定对象的 git 对象 ID,以便我可以使用 bfg 删除它?

4

1 回答 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 %"

例如,在我的回购seec中:

a255b5c1d469591037e4eacd0d7f4599febf2574 12884 seec.go
a7320d8c0c3c38d1a40c63a873765e31504947ff 12928 seec.go

我想清理;的a7320d8版本seec.go

如 BFG提交 12d1b00 所示

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

注意:双测试读取:

val blobIdsFile = Path.createTempFile()
blobIdsFile.writeStrings(badBlobs.map(_.name()),"\n")
run(s"--strip-blobs-with-ids ${blobIdsFile.path}")

意味着参数 to-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.goblob id a7320d8,我知道我可以将该 blob id 传递给 bfg (在“blob ids”文件中)。

于 2017-07-01T06:34:26.683 回答