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

时间:2016-02-22 10:36:01

标签: 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

以上两个SHAs是blops的SHA。现在我想找到包含那些blops的commit / branch。我第一次尝试:

$ git branch -a --contains 3e162c8313995980c8d6fc434c06789373364a47
error: object 3e162c8313995980c8d6fc434c06789373364a47 is a blob, not a commit

正如上面的消息所说,SHA用于blob而不是提交。这导致我:Which commit has this 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的相应提交。

2 个答案:

答案 0 :(得分:0)

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

git ls-tree --full-tree -r --long HEAD | sort -rnk4

如何找到SHA-1所在的位置?

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

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

git branch --contains <commit>

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

git tags--contains <commit>

如果没有提交的内容不在任何分支/标签中?

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

在执行大小计算之前,运行fsck查找是否为悬空物体或清理您的仓库。

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

答案 1 :(得分:0)

因为您已经具有blob的哈希值路径,所以可以通过使用此method来发现引入文件的提交的SHA1的高效方法。然后,按照之前的尝试,您可以使用git branch -a --contains <sha1>查找包含提交的分支。