GIT仅显示行数;更新的「;
只是想知道这在GIT命令行中是否可行GIT仅显示行数;更新的「;,git,git-diff,git-log,Git,Git Diff,Git Log,只是想知道这在GIT命令行中是否可行 我试图找到两个版本之间“更新”的行数。我已经找到了使用git diff和--stat和--shortstat--numstat选项的帮助。它似乎只显示添加和删除的行数。即使更新了一行,也会将其计为1个删除和1个插入。这是真的吗?是否有选项或任何实用程序(命令行)可以为我提供插入、更新和删除的行的详细信息?虽然无法直接从Git执行此操作(至少从2.13.0开始),但您可以通过解析统一的差异自行执行此操作,前提是您对更改行的构成进行了一些假设 如果N次删除后N次
我试图找到两个版本之间“更新”的行数。我已经找到了使用git diff和--stat和--shortstat--numstat选项的帮助。它似乎只显示添加和删除的行数。即使更新了一行,也会将其计为1个删除和1个插入。这是真的吗?是否有选项或任何实用程序(命令行)可以为我提供插入、更新和删除的行的详细信息?虽然无法直接从Git执行此操作(至少从2.13.0开始),但您可以通过解析统一的差异自行执行此操作,前提是您对更改行的构成进行了一些假设 如果N次删除后N次添加=N次更改行,那么这里有一个基于GNU awk的解决方案,它只输出在统一的差异补丁中添加/删除/更改的行数:
BEGIN {
inhunk = 0
adds = 0
deletes = 0
changes = 0
hunk_adds = 0
hunk_deletes = 0
}
function calcChanges() {
delta = hunk_adds - hunk_deletes
changes += (hunk_deletes < hunk_adds ? hunk_deletes : hunk_adds)
adds += (delta > 0 ? delta : 0)
deletes += (delta < 0 ? -delta : 0)
hunk_adds = 0
hunk_deletes = 0
}
/^@@|^diff/ {
calcChanges()
inhunk = ($1 == "@@") ? 1 : 0
}
/^+/ {
if (inhunk) {
hunk_adds += 1
}
}
/^-/ {
if (inhunk) {
hunk_deletes += 1
}
}
/^ / {
if (inhunk && hunk_adds + hunk_deletes > 0) {
calcChanges()
}
}
END {
calcChanges()
print "Lines added: " adds
print "Lines deleted: " deletes
print "Lines changed: " changes
}
上面考虑了一组N行的改变,如果一个大块头中有N个删除紧接着N个添加。例如:
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,4 @@
context
-deleted line
-deleted line
+added line
+added line
context
。。。计数2个已更改的行
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,3 +1,4 @@
context
-deleted line
+added line
+added line
context
。。。计为1个更改行和1个添加行
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,3 @@
context
-deleted line
-deleted line
+added line
context
。。。计为1个已更改行和1个已删除行
最后,
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,6 +1,6 @@
context
+added line
context
-deleted line
+added line
context
-deleted line
context
。。。计为1个添加行、1个更改行和1个删除行
脚本可以扩展为每个文件列出这些统计信息,但我保持了简单的方式来展示总体思路。虽然无法直接从Git执行此操作(至少在2.13.0中是这样),但您可以通过解析统一的diff来执行此操作,前提是您对更改行的组成进行了一些假设 如果N次删除后N次添加=N次更改行,那么这里有一个基于GNU awk的解决方案,它只输出在统一的差异补丁中添加/删除/更改的行数:
BEGIN {
inhunk = 0
adds = 0
deletes = 0
changes = 0
hunk_adds = 0
hunk_deletes = 0
}
function calcChanges() {
delta = hunk_adds - hunk_deletes
changes += (hunk_deletes < hunk_adds ? hunk_deletes : hunk_adds)
adds += (delta > 0 ? delta : 0)
deletes += (delta < 0 ? -delta : 0)
hunk_adds = 0
hunk_deletes = 0
}
/^@@|^diff/ {
calcChanges()
inhunk = ($1 == "@@") ? 1 : 0
}
/^+/ {
if (inhunk) {
hunk_adds += 1
}
}
/^-/ {
if (inhunk) {
hunk_deletes += 1
}
}
/^ / {
if (inhunk && hunk_adds + hunk_deletes > 0) {
calcChanges()
}
}
END {
calcChanges()
print "Lines added: " adds
print "Lines deleted: " deletes
print "Lines changed: " changes
}
上面考虑了一组N行的改变,如果一个大块头中有N个删除紧接着N个添加。例如:
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,4 @@
context
-deleted line
-deleted line
+added line
+added line
context
。。。计数2个已更改的行
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,3 +1,4 @@
context
-deleted line
+added line
+added line
context
。。。计为1个更改行和1个添加行
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,4 +1,3 @@
context
-deleted line
-deleted line
+added line
context
。。。计为1个已更改行和1个已删除行
最后,
diff --git a/blah.txt b/blah.txt
index deadbeef..ba5eba11 100644
--- a/blah.txt
+++ b/blah.txt
@@ -1,6 +1,6 @@
context
+added line
context
-deleted line
+added line
context
-deleted line
context
。。。计为1个添加行、1个更改行和1个删除行
该脚本可以扩展为每个文件列出这些统计信息,但我一直保持简单,以显示总体思路。
即使更新了一行,也会将其计为1个删除和1个插入。这是真的吗?
是的。谢谢,有没有办法计算更新的#行?即落入1 delete和1 insert桶中的行。据我所知,没有这样的选项。从技术上讲,很难区分“更新”和“1删除1插入”之间的区别。如果在总共有10个单词的行中只更改了一个单词,我们可以说这是一个更新。两个字怎么样?三个字?所有单词?即使一行被更新,也将被计为1个删除和1个插入。这是真的吗?
是的。谢谢,有没有办法计算更新的#行?即落入1 delete和1 insert桶中的行。据我所知,没有这样的选项。从技术上讲,很难区分“更新”和“1删除1插入”之间的区别。如果在总共有10个单词的行中只更改了一个单词,我们可以说这是一个更新。两个字怎么样?三个字?所有的话?