哪个git提交/分支包含此blob?

5

我正在使用这个脚本来计算我的代码库中前n个最大的块:

https://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

一个输出的例子:
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
2个回答

0

因为您已经拥有了Blob的哈希值和路径,可以使用这个方法来发现引入文件的提交的SHA1,这是一种非常高效的方法。然后,就像您之前尝试过的那样,可以使用git branch -a --contains <sha1>来查找包含该提交的分支。


-1
您可以运行此脚本来获取文件的大小(更加简单):
git ls-tree --full-tree -r --long HEAD | sort -rnk4

如何查找SHA-1在哪里?

注意:一旦您将文件添加到git(不是提交而是添加),git会打包并存储它。打包生成文件的SHA-1。这意味着,即使稍后您没有提交该文件,但仍然在您的.git文件夹中存储了SHA-1,即使它不是任何提交树的一部分。

假设您已将对象提交到分支中,以下是如何查找其所在分支的方法:

git branch --contains <commit>

你也可以传递标签而不是分支

git tags--contains <commit>

如果没有提交不在任何分支/标签中怎么办?

这意味着SHA-1不在任何提交中(如上所述)。

运行fsck以查找它是否为悬空对象或在执行大小计算之前清理您的存储库。

# clean repo
git fsck --full --prune=now

1
我已经更新了我的帖子。我尝试过git branch -a --contains <sha>,但正如消息中所述,它不接受blob sha。请注意,我正在寻找过去与blob相关的提交,这些提交不一定在任何分支的末端。 - u123

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