哪个git提交/分支包含此blob?
我正在使用此脚本计算存储库中最大的n个blop:哪个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
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