首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用git diff,我如何获得添加和修改的行号?

使用git diff,我如何获得添加和修改的行号?
EN

Stack Overflow用户
提问于 2011-11-25 00:11:01
回答 11查看 56.2K关注 0票数 86

假设我有一个文本文件

代码语言:javascript
复制
alex
bob
matrix
will be removed
git repo

我已经把它更新为

代码语言:javascript
复制
alex
new line here
another new line
bob
matrix
git

在这里,我添加了行号(2,3)和更新的行号(6)。

如何使用git diff或任何其他git命令获取这些行号信息?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-11-25 00:19:02

git diff --stat会向你展示你提交东西时得到的输出,我猜这就是你要引用的东西。

代码语言:javascript
复制
git diff --stat

为了准确显示已更改的行号,您可以使用

代码语言:javascript
复制
git blame -p <file> | grep "Not Committed Yet"

而更改的行将是结果中结束括号之前的最后一个数字。然而,这不是一个干净的解决方案:

票数 87
EN

Stack Overflow用户

发布于 2012-08-29 21:48:56

下面是一个bash函数,用于根据diff计算结果行数:

代码语言:javascript
复制
diff-lines() {
    local path=
    local line=
    while read; do
        esc=$'\033'
        if [[ $REPLY =~ ---\ (a/)?.* ]]; then
            continue
        elif [[ $REPLY =~ \+\+\+\ (b/)?([^[:blank:]$esc]+).* ]]; then
            path=${BASH_REMATCH[2]}
        elif [[ $REPLY =~ @@\ -[0-9]+(,[0-9]+)?\ \+([0-9]+)(,[0-9]+)?\ @@.* ]]; then
            line=${BASH_REMATCH[2]}
        elif [[ $REPLY =~ ^($esc\[[0-9;]*m)*([\ +-]) ]]; then
            echo "$path:$line:$REPLY"
            if [[ ${BASH_REMATCH[2]} != - ]]; then
                ((line++))
            fi
        fi
    done
}

它可以产生如下输出:

代码语言:javascript
复制
$ git diff | diff-lines
http-fetch.c:1: #include "cache.h"
http-fetch.c:2: #include "walker.h"
http-fetch.c:3: 
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:5: {
http-fetch.c:6:+       const char *prefix;
http-fetch.c:7:        struct walker *walker;
http-fetch.c:8:        int commits_on_stdin = 0;
http-fetch.c:9:        int commits;
http-fetch.c:19:        int get_verbosely = 0;
http-fetch.c:20:        int get_recover = 0;
http-fetch.c:21: 
http-fetch.c:22:+       prefix = setup_git_directory();
http-fetch.c:23:+
http-fetch.c:24:        git_config(git_default_config, NULL);
http-fetch.c:25: 
http-fetch.c:26:        while (arg < argc && argv[arg][0] == '-') {
fetch.h:1: #include "config.h"
fetch.h:2: #include "http.h"
fetch.h:3: 
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);
fetch.h:5: 
fetch.h:6: void start_fetch(const char* uri);
fetch.h:7: bool fetch_succeeded(int status_code);

从像这样的差异中:

代码语言:javascript
复制
$ git diff
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
 #include "cache.h"
 #include "walker.h"
 
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
 {
+       const char *prefix;
        struct walker *walker;
        int commits_on_stdin = 0;
        int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
        int get_verbosely = 0;
        int get_recover = 0;
 
+       prefix = setup_git_directory();
+
        git_config(git_default_config, NULL);
 
        while (arg < argc && argv[arg][0] == '-') {
diff --git a/fetch.h b/fetch.h
index 5fd3e65..d43e0ca 100644
--- a/fetch.h
+++ b/fetch.h
@@ -1,7 +1,7 @@
 #include "config.h"
 #include "http.h"
 
-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
+int main(int argc, const char **argv);
 
 void start_fetch(const char* uri);
 bool fetch_succeeded(int status_code);

如果您只想显示添加/删除/修改的行,而不是周围的上下文,那么可以将-U0传递给git diff:

代码语言:javascript
复制
$ git diff -U0 | diff-lines
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:6:+       const char *prefix;
http-fetch.c:22:+       prefix = setup_git_directory();
http-fetch.c:23:+
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);

它对ANSI颜色编码很健壮,所以您可以将--color=always传递给git diff,以获得添加/删除行的常用颜色编码。

可以很容易地对输出进行grepped:

代码语言:javascript
复制
$ git diff -U0 | diff-lines | grep 'main'
http-fetch.c:4:+int main(int argc, const char **argv)
fetch.h:4:+int main(int argc, const char **argv);

在你的例子中,git diff -U0会给出:

代码语言:javascript
复制
$ git diff -U0 | diff-lines
test.txt:2:+new line here
test.txt:3:+another new line
test.txt:6:-will be removed
test.txt:6:-git repo
test.txt:6:+git

如果您只需要行号,请将echo "$path:$line:$REPLY"更改为echo "$line"并通过uniq传输输出。

票数 28
EN

Stack Overflow用户

发布于 2014-05-20 13:48:41

我也遇到了同样的问题,所以我写了一个gawk脚本来更改git diff的输出,以便为每一行添加行号。当我需要比较工作树时,我发现它有时很有用,尽管它并不局限于此。也许它对这里的某个人有用?

代码语言:javascript
复制
$ git diff HEAD~1 |showlinenum.awk
diff --git a/doc.txt b/doc.txt
index fae6176..6ca8c26 100644
--- a/doc.txt
+++ b/doc.txt
@@ -1,3 +1,3 @@
1: red
2: blue
 :-green
3:+yellow

你可以从这里下载:

https://github.com/jay/showlinenum

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8259851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档