Git的for-each-ref命令有一个--count选项和一个--sort选项,这两个选项看起来都很简单,但是在一起使用时会产生问题。
排序用于确定计数是如何应用的,因此如果我用committerdate进行反向排序
git for-each-ref --count=30 --sort='-committerdate' refs/heads/ --format="%(refname:short)"然后我得到了最近的最高承诺。如果我想从底部得到最近的提交,倒转排序不是解决方案,因为它将更改列表中出现的提交。
我想要最后一次提交(这需要reverse-chronological排序),但是我希望它们按chronological顺序显示,所以最近的提交在底部,因此即使列表中的行比屏幕多,并且接近我当前的命令提示符,也可以在屏幕上显示。
是否有任何方法只使用Git (可能是其他命令而不是for-each-ref)来完成此操作?而且不需要通过另一组命令(这将降低效率并引入新的问题,比如避免剥离颜色的额外工作-我实际上使用的format字符串比上面显示的要复杂得多)。
发布于 2018-08-21 18:59:25
简短回答:不。
较长的答覆:
..。而且不需要通过另一组命令(这将降低效率,并引入新的问题,比如避免剥离颜色的额外工作-我实际上使用的格式字符串比上面所示的要复杂得多)。
效率的论点是有效的,但是..。只需做一些额外的工作,例如:
git for-each-ref --format=... --sort=... ... | sort -k1 -s | tail +<count> | cut -f2-其中,--format将sort命令所需的(非彩色)排序键作为装饰放在字段1中,然后用cut -f2-剥离。考虑一下通常的装饰-排序-取消装饰算法:由于--format,初始输入中存在装饰,而在未用于排序的字段中,sort -s本身是稳定的。
(显然,sort -s并不标准,但它得到了相当广泛的支持。)
发布于 2018-08-21 20:24:50
这归功于对基本想法的理解,但他的解决方案需要一些调整才能为我工作。(我尝试了GNU版本,以防与BSD和GNU实用程序相关,但这并没有解决任何问题。)我不能确定他不会在其他地方工作,所以,我不是“正确”的实际工作,我是单独添加这一点。
以下是对我起作用的东西:
YELLOW_HEAD="%(if)%(HEAD)%(then)%(color:bold yellow)%(else)%(color:white)%(end)"
git for-each-ref --color=always --count=30 --sort='-committerdate' refs/heads/ --format="%(committerdate:short) ${YELLOW_HEAD}%(committerdate:short) %(refname:short)" | sort -k1 -s | cut -f2- -d' '我还添加了我的格式,因为答案是完整的。
与托瑞克的回答不同:
-之后使用了+而不是tailgit-for-each-ref来过滤计数--而且由于我是而不是,所以我依赖它进行排序,这不是一个问题。sort正确排序的能力cut命令定义了分隔符git-for-each-ref总是显示颜色,没有颜色它就会先关闭颜色https://stackoverflow.com/questions/51954901
复制相似问题