哪个提交有这个小斑点?

哪个提交有这个小斑点?

给定BLOB的散列,是否有一种方法可以获得在其树中包含此BLOB的提交列表?



12345678_0001
浏览 401回答 3
3回答

繁星点点滴滴

以下两个脚本都将BLOB的SHA 1作为第一个参数,在此之后,可以选择以下任何参数git log会理解的。例如:--all在所有分支中搜索,而不是仅搜索当前分支,或-g在翻车里搜索,或者其他你想要的东西。在这里,它是一个shell脚本-短而甜蜜,但缓慢:#!/bin/shobj_name="$1"shift git&nbsp;log&nbsp;"$@"&nbsp;--pretty=format:'%T&nbsp;%h&nbsp;%s'&nbsp;\|&nbsp;while&nbsp;read&nbsp;tree&nbsp;commit&nbsp;subject&nbsp;;&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;git&nbsp;ls-tree&nbsp;-r&nbsp;$tree&nbsp;|&nbsp;grep&nbsp;-q&nbsp;"$obj_name"&nbsp;;&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$commit&nbsp;"$subject" &nbsp;&nbsp;&nbsp;&nbsp;fidone还有一个优化的Perl版本,它仍然很短,但速度要快得多:#!/usr/bin/perluse&nbsp;5.008;use&nbsp;strict;use&nbsp;Memoize;my&nbsp;$obj_name;sub&nbsp;check_tree&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;(&nbsp;$tree&nbsp;)&nbsp;=&nbsp;@_; &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;@subtree; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open&nbsp;my&nbsp;$ls_tree,&nbsp;'-|',&nbsp;git&nbsp;=>&nbsp;'ls-tree'&nbsp;=>&nbsp;$tree &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;die&nbsp;"Couldn't&nbsp;open&nbsp;pipe&nbsp;to&nbsp;git-ls-tree:&nbsp;$!\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;<$ls_tree>&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/\A[0-7]{6}&nbsp;(\S+)&nbsp;(\S+)/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;die&nbsp;"unexpected&nbsp;git-ls-tree&nbsp;output"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1&nbsp;if&nbsp;$2&nbsp;eq&nbsp;$obj_name; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;@subtree,&nbsp;$2&nbsp;if&nbsp;$1&nbsp;eq&nbsp;'tree'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;check_tree(&nbsp;$_&nbsp;)&nbsp;&&&nbsp;return&nbsp;1&nbsp;for&nbsp;@subtree; &nbsp;&nbsp;&nbsp;&nbsp;return;}memoize&nbsp;'check_tree';die&nbsp;"usage:&nbsp;git-find-blob&nbsp;<blob>&nbsp;[<git-log&nbsp;arguments&nbsp;...>]\n" &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;@ARGV;my&nbsp;$obj_short&nbsp;=&nbsp;shift&nbsp;@ARGV;$obj_name&nbsp;=&nbsp;do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;$ENV{'OBJ_NAME'}&nbsp;=&nbsp;$obj_short; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`git&nbsp;rev-parse&nbsp;--verify&nbsp;\$OBJ_NAME`;}&nbsp;or&nbsp;die&nbsp;"Couldn't&nbsp;parse&nbsp;$obj_short:&nbsp;$!\n";chomp&nbsp;$obj_name;open&nbsp;my&nbsp;$log,&nbsp;'-|', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;git&nbsp;=>&nbsp;log&nbsp;=>&nbsp;@ARGV,&nbsp;'--pretty=format:%T&nbsp;%h&nbsp;%s' &nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;die&nbsp;"Couldn't&nbsp;open&nbsp;pipe&nbsp;to&nbsp;git-log:&nbsp;$!\n";while&nbsp;(&nbsp;<$log>&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;chomp; &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;(&nbsp;$tree,&nbsp;$commit,&nbsp;$subject&nbsp;)&nbsp;=&nbsp;split&nbsp;"&nbsp;",&nbsp;$_,&nbsp;3; &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"$commit&nbsp;$subject\n"&nbsp;if&nbsp;check_tree(&nbsp;$tree&nbsp;);}

心有法竹

不幸的是,脚本对我来说有点慢,所以我不得不进行一些优化。幸运的是,我不仅有散列,而且还有文件的路径。git&nbsp;log&nbsp;--all&nbsp;--pretty=format:%H&nbsp;--&nbsp;<path>&nbsp;|&nbsp;xargs&nbsp;-n1&nbsp;-I%&nbsp;sh&nbsp;-c&nbsp;"git&nbsp;ls-tree&nbsp;%&nbsp;--&nbsp;<path>&nbsp;|&nbsp;grep&nbsp;-q&nbsp;<hash>&nbsp;&&&nbsp;echo&nbsp;%"

胡说叔叔

我认为这通常是一件有用的事情,所以我编写了一个小小的Perl脚本来完成它:#!/usr/bin/perl&nbsp;-wuse&nbsp;strict;my&nbsp;@commits;my&nbsp;%trees;my&nbsp;$blob;sub&nbsp;blob_in_tree&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$tree&nbsp;=&nbsp;$_[0]; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(defined&nbsp;$trees{$tree})&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$trees{$tree}; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$r&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;open(my&nbsp;$f,&nbsp;"git&nbsp;cat-file&nbsp;-p&nbsp;$tree|")&nbsp;or&nbsp;die&nbsp;$!; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(<$f>)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(/^\d+&nbsp;blob&nbsp;(\w+)/&nbsp;&&&nbsp;$1&nbsp;eq&nbsp;$blob)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elsif&nbsp;(/^\d+&nbsp;tree&nbsp;(\w+)/)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r&nbsp;=&nbsp;blob_in_tree($1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;if&nbsp;$r; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;close($f); &nbsp;&nbsp;&nbsp;&nbsp;$trees{$tree}&nbsp;=&nbsp;$r; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$r;}sub&nbsp;handle_commit&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$commit&nbsp;=&nbsp;$_[0]; &nbsp;&nbsp;&nbsp;&nbsp;open(my&nbsp;$f,&nbsp;"git&nbsp;cat-file&nbsp;commit&nbsp;$commit|")&nbsp;or&nbsp;die&nbsp;$!; &nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$tree&nbsp;=&nbsp;<$f>; &nbsp;&nbsp;&nbsp;&nbsp;die&nbsp;unless&nbsp;$tree&nbsp;=~&nbsp;/^tree&nbsp;(\w+)$/; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(blob_in_tree($1))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"$commit\n"; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$parent&nbsp;=&nbsp;<$f>; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;unless&nbsp;$parent&nbsp;=~&nbsp;/^parent&nbsp;(\w+)$/; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;@commits,&nbsp;$1; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;close($f);}if&nbsp;(!@ARGV)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;STDERR&nbsp;"Usage:&nbsp;git-find-blob&nbsp;blob&nbsp;[head&nbsp;...]\n"; &nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1;}$blob&nbsp;=&nbsp;$ARGV[0];if&nbsp;(@ARGV&nbsp;>&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(@ARGV)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handle_commit($_); &nbsp;&nbsp;&nbsp;&nbsp;}}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;handle_commit("HEAD");}while&nbsp;(@commits)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;handle_commit(pop&nbsp;@commits);}我今晚回家后会把这个放在GitHub上。更新:看起来像是有人已经做过了..它使用相同的一般想法,但细节不同,实现是多更短。我不知道哪一个会更快,但性能可能不是这里关心的问题!更新2:就其价值而言,我的实现速度快了几个数量级,特别是对于大型存储库。那,那个git ls-tree -r真的很疼。更新3:我应该注意到,我上面的性能评论适用于我在第一次更新中链接到的实现。亚里士多德的实现和我的差不多。更详细的评论给那些好奇的人。
打开App,查看更多内容
随时随地看视频慕课网APP