GitHub差异:计算字符数而不是行数

dba5bblo  于 2023-01-19  发布在  Git
关注(0)|答案(2)|浏览(138)

我搜索了一下,什么也没找到;所以,决定看看社区在这方面能提供什么。
当你提交到GitHub时,它会执行一个diff,告诉你添加了多少 * 行 *,删除了多少 * 行 *。
从度量的Angular 来看,考虑到我使用的许多语言并不依赖于空格字符来运行,这并没有给我留下太多印象,因此,可以在一行中定义一个包含50个方法的整个类(当然,您不会这么做)。
测量线可以让我们相信单线解决方案本质上比其他方案更好。
所以,我很好奇是否有一种方法可以让GitHub(或Git)显示非空格字符数的差异。
示例:

class Something
{
    function hello()
    {
    }
}

变更为:

class Something {
    function hello() {
    }
}

会导致这样的结果:
生产线变更:字符更改:0

nfs0ujit

nfs0ujit1#

使用以下命令查找线路变化(从显示的最终结果中减去1)

git diff abc.txt | grep  "+" |grep -c -v "@@"

产量:3

git diff abc.txt

输出:

diff --git a/abc.txt b/abc.txt
index 9ab6740..c2ab3e3 100644
--- a/abc.txt
+++ b/abc.txt
@@ -1,5 +1,5 @@
 my
-qq
+qq1
 wq
 my
 q
@@ -8,7 +8,7 @@ q
 q
 q
 q
-q
+q1
 q
 q
ufj5ltwl

ufj5ltwl2#

我遇到了类似的问题,并尝试使用git diff--word-diff参数来解决它。
医生
echo $(git diff --cached --word-diff --color | grep -oP '\x1b\[[0-9;]*m\{\+([^\x1b]*)\+\}\x1b' | cut -d+ -f 2- | rev | cut -d+ -f 2- | tr -d '\n' | wc -c) - $(git diff --cached --word-diff --color | grep -oP '\x1b\[[0-9;]*m\[\-([^\x1b]*)\-\]\x1b' | cut -d- -f 2- | rev | cut -d- -f 2- | tr -d '\n' | wc -c) | bc
一些解释:

  • git diff --cached --word-diff --color

根据HEAD打印当前暂存的单词diff。

  • grep -oP '\x1b\[[0-9;]*m\{\+([^\x1b]*)\+\}\x1b'

过滤所有添加的内容(如果在git config中更改了颜色也是如此)。

  • cut -d+ -f 2- | rev | cut -d+ -f 2-

复杂的版本过滤周围的{++}之间的内容,我不能拿出一个可靠的替代版本。

  • tr -d '\n' | wc -c

计算不带换行符的字符数。
第二部分实际上是完全相同的,但是对于删除的内容,匹配[--]而不是{++},毕竟echo-连接两个数字,这样bc就可以计算出差值。
还有一点意见:我选择了彩色输出,因为这使得模式匹配更加容易(在添加用于匹配开始或结束的字符时,如+}[-等)
下面是用Python编写的基本相同的逻辑:

from subprocess import Popen, PIPE
import re

process = Popen(["git", "diff", "--cached", "--word-diff", "--color"], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

if stderr:
  print(stderr.decode())
  exit(1)

stdout = stdout.decode()
added = re.findall(r"\x1b\[[0-9;]*m\{\+([^\x1b]*)\+\}\x1b", stdout)
deleted = re.findall(r"\x1b\[[0-9;]*m\[-([^\x1b]*)-\]\x1b", stdout)
num_added = sum(len(a) for a in added)
num_deleted = sum(len(d) for d in deleted)
print(num_added - num_deleted)

将它保存在一个文件中,然后从git仓库中调用它。

相关问题