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

哪个git提交/分支包含此blob?,git,Git,我正在使用此脚本计算存储库中最大的n个blop: MINGW64 /c/tmp/MyRepo.bare (BARE:master) $ ./blop-to-commit.sh 3e162c8313995980c8d6fc434c06789373364a47 MINGW64 /c/tmp/MyRepo.bare (BARE:master) 输出的一个示例: 54016,13273,0ef462bf57e8c036b00b52d6cc0fd91b2fc2a827 Data/Db.MDF 309

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

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

MINGW64 /c/tmp/MyRepo.bare (BARE:master)

输出的一个示例:

54016,13273,0ef462bf57e8c036b00b52d6cc0fd91b2fc2a827 Data/Db.MDF
30976,8734,3e162c8313995980c8d6fc434c06789373364a47 Tools/connector.dll
上面的两个sha是用于blops的sha。现在我想找到包含这些blop的commit/分支。我首先尝试:

$ git branch -a --contains 3e162c8313995980c8d6fc434c06789373364a47
error: object 3e162c8313995980c8d6fc434c06789373364a47 is a blob, not a commit
正如上面的消息所说,SHA是用于blob而不是commit的。这使我想到:

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

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的相应提交。

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


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

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

git branch --contains <commit>

因为您已经有了blob的散列和路径,所以可以使用这个方法来发现引入文件的提交的SHA1,这是一个非常高效的方法。然后,正如您之前尝试的那样,您可以使用
git branch-a--contains
查找包含提交的分支。

尝试运行
git fsck
以查看blob是否不是悬空对象我已经更新了我的帖子。我确实尝试了git分支-a--contains,但从消息中可以看出,它不接受blob-sha的。请注意,我正在寻找不一定位于任何分支顶端的blob的提交。
git tags--contains <commit>
# clean repo
git fsck --full --prune=now