如何使用Git输出指定修订范围的短提交哈希与对应变更文件?
实现方法
你原命令的格式问题来自--name-only参数的默认逻辑:该参数会在提交信息块输出完成后,将每个变更文件单独打印为一行,同时自动插入空行分隔不同提交,Git没有内置参数可以直接把变更文件和提交哈希拼接在同一行,用awk做流处理即可实现需求,无额外依赖,全环境兼容。
- 如果你需要常规的空格分隔格式(提交哈希在前,后跟变更文件,文件间用空格分隔),直接执行以下命令:
git --no-pager log --name-only --format="%H" master.. | awk ' BEGIN { cur_hash = ""; cur_files = "" } /^[0-9a-f]{7,40}$/ { if (cur_hash != "") print cur_hash, cur_files cur_hash = substr($0, 1, 7) cur_files = "" next } NF > 0 { cur_files = cur_files ? cur_files " " $0 : $0 } END { if (cur_hash != "") print cur_hash, cur_files } '
- 如果你需要和你给出的示例完全一致,同提交的多个文件名用逗号分隔,使用以下版本即可:
git --no-pager log --name-only --format="%H" master.. | awk ' BEGIN { cur_hash = ""; cur_files = "" } /^[0-9a-f]{7,40}$/ { if (cur_hash != "") print cur_hash, cur_files cur_hash = substr($0, 1, 7) cur_files = "" next } NF > 0 { cur_files = cur_files ? cur_files "," $0 : $0 } END { if (cur_hash != "") print cur_hash, cur_files } '
调整说明
- 命令中
substr($0, 1, 7)是取提交哈希的前7位,和原--oneline参数输出的短哈希长度一致,如果需要完整长度的提交哈希,把该行替换为cur_hash = $0即可。 - 逻辑会自动过滤原输出中的所有空行,每一行对应一个提交。如果你需要变更文件在前、提交哈希在后,把所有
print cur_hash, cur_files替换为print cur_files, cur_hash即可。
内容的提问来源于stack exchange,提问作者geckos
相关产品推荐
相关产品推荐

