我正在使用这个脚本来计算我的代码库中前n个最大的块:
一个输出的例子:54016,13273,0ef462bf57e8c036b00b52d6cc0fd91b2fc2a827 Data/Db.MDF
30976,8734,3e162c8313995980c8d6fc434c06789373364a47 Tools/connector.dll
上面的两个SHA是blops的SHA。现在我想找到包含这些blops的提交/分支。我首先尝试了:
$ git branch -a --contains 3e162c8313995980c8d6fc434c06789373364a47
error: object 3e162c8313995980c8d6fc434c06789373364a47 is a blob, not a commit
正如上面的消息所说,SHA是针对blob而不是commit的。这让我想到:哪个commit拥有这个blob? 我已经按照上面的帖子创建了两个脚本,并将它们添加到我的存储库根目录中。但是当我运行它们时,没有任何输出:
MINGW64 /c/tmp/MyRepo (master)
$ ./blop-to-commit.sh 3e162c8313995980c8d6fc434c06789373364a47
MINGW64 /c/tmp/MyRepo (master)
我也尝试在本地裸克隆的存储库上运行它:
MINGW64 /c/tmp/MyRepo.bare (BARE:master)
$ ./blop-to-commit.sh 3e162c8313995980c8d6fc434c06789373364a47
MINGW64 /c/tmp/MyRepo.bare (BARE:master)
你有没有想过为什么我在历史记录中找不到包含那个bloP的提交/分支?
编辑/解决方案:
看起来我只需要在git log命令中添加--all选项:
shift
git log --all "$@" --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
if git ls-tree -r $tree | grep -q "$obj_name" ; then
echo $commit "$subject"
fi
done
如下所示:
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (100278/100278), done.
Checking connectivity: 100342, done.
dangling commit 3f8cd0a581ec694e7371f7e4183e1cad8fa87647
dangling commit d5c0f41337ae1ef8e5cfbfd4f70077c36d231cf1
dangling commit b01831f4e6679ef2696a83e6dbaa04eaf6748f85
dangling commit 82b32531c23202d123f693bba64b040b3247636b
dangling commit 4fa8ce87c268a7ddb7c4e72d6810f70e197d5812
dangling commit 3ce38a0b8e5dbb7424a88359bbe0d9130ced34dc
然后我做了:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
但我仍然没有看到与最初列出的blob相对应的提交。
git fsck
命令,以查看该 blob 是否为悬空对象。 - LeGEC