我该如何创建一个带有完整上下文的补丁?
我尝试了 --unified=2000
,它会提供2000行上下文:
git diff --unified=2000 branch master --no-prefix > patch
如何在不指定最大行数的情况下包含文件中的所有行?
-U
选项与提问者使用的 --unified=
选项相同,唯一的区别是你指定的上下文行数较少,只有1000行,而提问者使用的是2000行。@balki 想知道如何将行数增加到无限大,但你建议将行数减半。为什么? - Mr. Lance E Sloangit show
时也非常好用! - Shakeel--no-prefix
选项可以去除默认情况下出现的“/a/”和“/b/”目标路径前缀。(链接页面) - luckydonald我知道这已经很老了,但我也不喜欢硬编码的解决方案,所以我测试了一下:
git diff -U$(wc -l MYFILE)
使用-U似乎是解决该问题的唯一方法,但使用行数承诺即使在非常大的文件中进行小改动也可以正常工作。
<
is not necessary. git diff -U$(wc -l MYFILE) MYFILE
- balkigit diff -U$(wc -l MYFILE | awk '{print $1}') MYFILE
是更好的答案,它通过获取不包含空白行的行数来正确解析 wc
的输出,而不是依靠未加引号的子 shell 输出创建两个参数,并且适用于 macOS/BSD。 - anishpatel一个名为"
diff.context
"的新配置变量可用于在修补程序输出中提供默认上下文行数,以覆盖硬编码默认的3行。
因此,这可以帮助生成更完整的上下文。
受到灵感的启发,我添加了一个Git别名。
$ cat ~/.gitconfig | fgrep diff
df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>
更新:
刚刚发现 git df
有时无法工作,原因是执行 git 别名时目录发生了变化 (详见git aliases operate in the wrong directory)。此外,@Moises Soto 在 macOS 上提到 wc
命令的输出格式不同(wc -l
输出前面有6个空格),建议使用 awk
。因此这是更新后的版本:
$ 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}" | awk '{print $1}') "${FILE}"
done
exit 0
git df
只有一个文件,你的版本也可以工作,但是我的版本支持git df
多个文件。 - Yun Wu我只是使用
git diff -W Git.md
列出文件的完整路径。来自man git diff
:
-W,--function-context
显示每个更改的整个函数作为上下文行。
之前接受的解决方案在查看特定文件/提交时对我不起作用(-U
选项似乎会影响版本/路径解析),但是在git version 2.24.0
上,--inter-hunk-context=
在这种情况下有效:
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