我想通过 bash 脚本在一次提交中获取文件的修改行号。
我搜索了很多并得到了这样的脚本:
git diff --unified=0 HEAD origin/develop .gitlab-ci.yml | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'
但是这个脚本只显示修改的行号,不显示添加的行。有谁知道该怎么做吗?
示例: 本地 .gitlab-ci.yml 文件:
a
b
c
远程开发分支:
a
k
脚本应该输出2和3。因为第2行被更改并添加了新行“c”,所以行号是3,所以它应该输出2和3。
您首先要求对单个提交进行修改,而稍后的问题会要求与远程分支进行比较,远程分支可以是从零到无限数量的提交。
您还询问更改行,但是任何计算机程序都不可能确定。
话虽如此,这就是我认为您所要求的。如果只是在一次提交中进行更改,您可以使用
git blame $THE_COMMIT -- filename
,然后仅过滤掉具有 $THE_COMMIT
sha 值的行。责怪行直接包含行号,因此下一步只需提取该行号。
为了比较多个提交,
git blame
不起作用,但是存在一个git diff-blame
工具,它可以按照名称所示操作,并且可以以相同的方式使用,尽管您想使用的
downstream
分支我的 fork 让它不会在管道中打印 ansi 颜色格式并支持比较单个文件。
# NB, the -- before the file name is mandatory.
git diff-blame HEAD origin/develop -- .gitlab-ci.yml \
| grep '^ [+-]' \
| cut -d ')' -f1 \
| rev \
| awk '{print $1}' \
| rev
# Assuming no ")" in the author name.