如何获得完整上下文的git diff?

How to get git diff with full context?

如何创建适合在坩埚中检查的补丁?

1
git diff branch master --no-prefix > patch

这只产生3行上下文。 所以我做了以下几点

1
git diff --unified=2000 branch master --no-prefix > patch

希望所有文件都少于2000行。 有没有办法告诉git包含补丁文件中的所有行而不必指定最大行?


这看起来非常好用:

1
git diff --no-prefix -U1000

随着警告:

The -U flag specifies lines of context. You might need to increase this if there are more than 1000 lines between your changes.


我知道这是旧的,但我也不喜欢硬编码的解决方案,所以我测试了这个:

1
git diff -U$(wc -l MYFILE)

使用-U似乎是解决问题的唯一方法,但使用行计数可以证明它可以在非常大的文件中进行小的更改。


注:git1.8.1rc1宣布(2012年12月8日)包括:

A new configuration variable"diff.context" can be used to give the default number of context lines in the patch output, to override the hardcoded default of 3 lines.

这样可以帮助生成更完整的上下文。


得到了灵感,所以我添加了一个git别名。

1
2
3
$ cat ~/.gitconfig | fgrep diff
        df ="!git diff -U$(wc -l "$1" | cut -d ' ' -f 1) "$1""
$ git df <file>

更新:

刚发现"git df"有时不起作用,因为执行git别名时目录更改了。 (请参阅git别名在错误的目录中运行)。
所以这是更新版本:

1
2
3
4
5
6
7
8
9
$ cat ~/.gitconfig | fgrep df
        df ="! [ "$GIT_PREFIX" != "" ] && cd "$GIT_PREFIX"; ~/bin/git_df.sh"
$
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l"${FILE}" | cut -d ' ' -f 1)"${FILE}"
done
exit 0

这在Mac OS上对我有用:

1
git diff -U$(wc -l main.htm | xargs)

请参阅"如何从Bash变量中修剪空格?"