哪个 git commit/branch 包含这个 blob?

u12*_*123 5 git

我正在使用此脚本来计算存储库中的 n 个最大的 blops:

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
Run Code Online (Sandbox Code Playgroud)

上面的两个 SHA 是 blob 的 SHA。现在我想找到包含这些斑点的提交/分支。我首先尝试:

$ git branch -a --contains 3e162c8313995980c8d6fc434c06789373364a47
error: object 3e162c8313995980c8d6fc434c06789373364a47 is a blob, not a commit
Run Code Online (Sandbox Code Playgroud)

正如上面的消息所述,SHA 适用于 blob,而不是提交。这让我想到:哪个提交有这个 blob?

我已经从上面的帖子创建了两个脚本,并将它们添加到我的存储库的根目录中。但是当我运行它们时,没有任何输出:

MINGW64 /c/tmp/MyRepo (master)
$ ./blop-to-commit.sh 3e162c8313995980c8d6fc434c06789373364a47

MINGW64 /c/tmp/MyRepo (master)
Run Code Online (Sandbox Code Playgroud)

还尝试在存储库的本地裸克隆上运行它:

MINGW64 /c/tmp/MyRepo.bare (BARE:master)
$ ./blop-to-commit.sh 3e162c8313995980c8d6fc434c06789373364a47

MINGW64 /c/tmp/MyRepo.bare (BARE:master)
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么我在历史上的某个时刻没有得到包含该错误的提交/分支?

编辑/解决方案:

似乎我只需将 --all 选项添加到 git log 命令:

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
Run Code Online (Sandbox Code Playgroud)

如下建议:

$ 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
Run Code Online (Sandbox Code Playgroud)

然后我做了:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

但我仍然没有看到最初列出的 blob 的相应提交。

Cod*_*ard -1

您可以运行此脚本来获取文件的大小(更简单):

git ls-tree --full-tree -r --long HEAD | sort -rnk4
Run Code Online (Sandbox Code Playgroud)

如何找到 SHA-1 的位置?

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

假设您确实将对象提交到分支中,这里是如何找出它所在的分支:

git branch --contains <commit>
Run Code Online (Sandbox Code Playgroud)

您还可以传递标签而不是分支

git tags--contains <commit>
Run Code Online (Sandbox Code Playgroud)

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

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

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

# clean repo
git fsck --full --prune=now
Run Code Online (Sandbox Code Playgroud)