Как получить git diff с полным контекстом?

115

Как создать патч, пригодный для просмотра в тигле?

git diff branch master --no-prefix > patch

Это генерирует только 3 строки контекста. Итак, я делаю следующее

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

Надеюсь, во всех файлах будет меньше 2000 строк. Есть ли способ указать git включить все строки в файл для патча без необходимости указывать максимальное количество строк?

балки
источник
3
Я разместил опцию -U <infinity>, чтобы показать весь файл в виде отдельного вопроса stackoverflow.com/questions/28727424/…
Александр Левчук

Ответы:

55

Я знаю, что это устарело, но мне также не нравятся жестко запрограммированные решения, поэтому я протестировал это:

git diff -U$(wc -l MYFILE)

Использование -U кажется единственным способом решения проблемы, но использование подсчета строк обещает, что он будет работать даже для небольшого изменения в очень большом файле.

Ezra
источник
1
<не обязательно. git diff -U$(wc -l MYFILE) MYFILE
balki
2
Спасибо @balki, я попробовал ваше предложение и заметил, что <pre> $ (wc -l MYFILE) </pre> расширяется до количества строк, за которым следует имя файла, поэтому второе использование имени файла также может быть опущено. Я обновляю свой ответ, чтобы отразить это.
Ezra
4
Это дифф, есть две версии файла. Что, если версия, отсутствующая на диске, была вдвое длиннее? Разве -U с действительно большим числом не безопаснее?
Eloff
@Eloff, это правда, лучше всего было бы максимально увеличить длину, поскольку у действительно больших чисел все еще есть обратная проблема. Это решение предполагает, что непрерывных удалений, превышающих текущий размер файла на диске, не производилось.
Эзра
3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILE- лучший ответ, который правильно анализирует вывод wc, получая только количество строк без пробелов, не полагаясь на вывод подоболочки без кавычек для создания двух аргументов, и работает в macOS / BSD.
анишпател
95

Это , кажется, работает очень хорошо:

git diff --no-prefix -U1000

С оговоркой:

-UФлаг указывает строки контекста. Возможно, вам придется увеличить это значение, если между вашими изменениями больше 1000 строк.

c24w
источник
16
-UВариант вы предлагаете такой же , как --unified=вариант , используемого спрашивающей. Единственное отличие состоит в том, что вы указываете меньше строк контекста, 1000, чем использовавший запрос, 2000. @balki хотел знать, как увеличить число до бесконечности, но вы предлагаете сократить число вдвое. Зачем?
LS
4
@LS: да, теперь я понимаю, но не заметил этого пару лет назад. Тем не менее, это немного более очевидно, чем в вопросе, и, кажется, помогает странному человеку, который приземляется здесь.
c24w
Спасибо за это, тоже отлично работает с git show!
Шакил
@ c24w Согласен, все равно получаю то, что я хочу видеть на экране.
Chef Pharaoh
1
Эта --no-prefixопция избавляется от префиксов назначения «/ a /» и «/ b /», которые отображаются по умолчанию. (связанная страница)
luckydonald
10

Примечание. Объявление git1.8.1rc1 (8 декабря 2012 г.) включает:

Новая переменная конфигурации " diff.context" может использоваться для задания количества строк контекста по умолчанию в выходных данных патча, чтобы переопределить жестко заданное по умолчанию 3 строки.

так что это могло бы помочь здесь создать более полный контекст.

VonC
источник
7
Тем не менее, у него нет возможности сказать «Все строки в файле»
балки
3
Я подозреваю, что добавление большого числа, которое имитирует «все линии»
VonC
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
Stefco
источник