Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GIT仅显示行数;更新的「;_Git_Git Diff_Git Log - Fatal编程技术网

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命令行中是否可行


我试图找到两个版本之间“更新”的行数。我已经找到了使用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个单词的行中只更改了一个单词,我们可以说这是一个更新。两个字怎么样?三个字?所有的话?