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

问题描述 投票:0回答:7

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

我试过

--unified=2000
,它给出了2000行上下文:

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

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

git diff git-diff
7个回答
127
投票

似乎工作得很好:

git diff --no-prefix -U1000

警告:

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


77
投票

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

git diff -U$(wc -l MYFILE)

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


11
投票

Note: git1.8.1rc1 announce (December 8th, 2012)包括:

一个新的配置变量“

diff.context
”可用于在补丁输出中给出默认的上下文行数,以覆盖 3 行的硬编码默认值。

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


5
投票

得到灵感,所以我添加了一个 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

2
投票

这在 macOS 上对我有用:

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

参见“如何从 Bash 变量中修剪空格?”


0
投票

我只是用

git diff -W Git.md

列出文件的完整补丁。来自

man git diff

-W, --function-context
将整个函数显示为每个更改的上下文行。


-1
投票

以前接受的解决方案在查看 specific 文件/提交时对我不起作用(

-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
© www.soinside.com 2019 - 2024. All rights reserved.