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


114

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

git diff branch master --no-prefix > patch

这仅生成3行上下文。所以我做以下

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

希望所有文件少于2000行。有没有一种方法可以告诉git将文件中的所有行都包含在补丁中,而不必指定最大行数?


3
我张贴的-U <无限>选项来显示整个文件,作为一个单独的问题stackoverflow.com/questions/28727424/...
亚历山大Levchuk

Answers:


54

我知道这已经很老了,但是我也不喜欢硬编码的解决方案,因此我对此进行了测试:

git diff -U$(wc -l MYFILE)

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


1
<没有必要。git diff -U$(wc -l MYFILE) MYFILE
巴尔基

2
感谢@balki,我尝试了您的建议,并注意到<pre> $(wc -l MYFILE)</ pre>扩展为行数,后跟文件名,因此也可以省略文件名的第二次使用。我正在更新我的答案以反映这一点。
以斯拉

4
这是一个差异,文件有两个版本。如果磁盘上没有的版本是两倍长,该怎么办?数量很多的-U真的不是更安全吗?
Eloff '18

@Eloff,是的,最好的方法是最大长度,因为很大的数字仍然存在相反的问题。该解决方案假定未进行大于磁盘上当前文件大小的连续删除。
伊兹拉

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILE是一个更好的答案,可以wc通过仅获取没有空格的行数,不依赖子外壳程序的未引用输出来创建两个参数来正确解析输出,并且可以在macOS / BSD上运行。
anishpatel

94

似乎很好地工作:

git diff --no-prefix -U1000

注意:

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


16
-U你的建议选择是一样的--unified=由提问者使用的选项。唯一的区别是您指定的上下文行数少于使用的问询者2000的行数。@ balki想知道如何将数字增加到无穷大,但建议将数字减半。为什么?
LS

4
@LS:是的,我现在知道了,但是几年前却忽略了这一点。不过,发生的问题比问题要明显得多,似乎可以帮助落在这里的奇人。
c24w

谢谢这个,它也可以很好地与git show
沙克尔(Shakeel)

@ c24w同意,仍然可以得到我想在屏幕上看到的内容。
法老王大厨

1
--no-prefix选项摆脱了默认显示的“ / a /”和“ / b /”目标前缀。(链接的页面)
luckydonald

10

注意:git1.8.1rc1公告(2012年12月8日)包括:

diff.context可以使用新的配置变量“ ”在补丁输出中提供默认数量的上下文行,以覆盖3行的硬编码默认行。

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


7
但这并不能说“文件中的所有行”
balki 2012年

3
我怀疑放置大量数字会模拟“所有线条”
VonC 2012年

7
“我怀疑放置大量数字会模拟“所有线条””……除非它没有,然后事情中断了。所有人都是无限的代名词,一个很大的数字就是无限,而不是无限。
特伦顿

4

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

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

更新:

刚发现“ git df”有时不起作用,原因是执行git别名时目录更改。(请参阅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


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.