如何在完整上下文中得到 git diff?

如何创建具有完整上下文的补丁?

我试用了 --unified=2000,它提供了2000行上下文:

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

如何在不指定最大行数的情况下包含文件中的所有行?

60502 次浏览

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

一个新的配置变量“ diff.context”可以用来给补丁输出中的默认上下文行数,以覆盖3行的硬编码默认值。

所以这可以帮助,在这里,生成一个更完整的上下文。

这个 看起来效果不错:

git diff --no-prefix -U1000

附带说明:

-U标志指定上下文行。如果更改之间有超过1000行,则可能需要增加此值。

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

git diff -U$(wc -l MYFILE)

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

这对我在 macOS 上很有用:

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

“如何从 Bash 变量中删除空格?”

得到了灵感,所以我加了个 Git 化名。

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

更新:

刚刚发现“ gitdf”有时不工作,由于目录改变时执行 gitalias。(见 Git 别名在错误的目录下操作)。 这是最新版本:

$ 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

在查看 具体点文件/提交时,以前接受的解决方案对我来说不起作用(-U选项似乎与 rev/path 解析有关) ,但是 --inter-hunk-context=在这种情况下对 git version 2.24.0起作用:

git diff \
--no-prefix \
--inter-hunk-context=2000 \
master -- \
path/to/file.py

如果你不知道文件大小,你当然可以用 wc -l而不是硬编码找到它:

git diff \
--no-prefix \
--inter-hunk-context=$(wc -l path/to/file.py) \
master -- \
path/to/file.py