我正在使用此脚本来计算我的存储库中的n个最大blops:
输出的一个例子:
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的相应提交。
答案 0 :(得分:0)
您可以运行此脚本来获取文件的大小(更简单):
git ls-tree --full-tree -r --long HEAD | sort -rnk4
注意: 一旦将文件添加到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>
查找包含提交的分支。