Як отримати git diff з повним контекстом?


114

Як створити патч, придатний для огляду в тиглі?

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/…
Олександр Левчук,

Відповіді:


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, це правда, найкращим способом було б збільшити довжину, оскільки дійсно великі числа все ще мають протилежну проблему. Це рішення передбачає, що не було зроблено суміжних видалень, більших за поточний розмір файлу на диску.
Езра

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=варіант , використовуваного запитуючої. Єдина відмінність полягає в тому, що ви вказуєте менше рядків контексту, на 1000, ніж використовував запитувач, 2000. @balki хотів знати, як збільшити число до нескінченності, але ви пропонуєте скоротити число вдвічі. Чому?
LS

4
@LS: Так, я розумію зараз, але проігнорував це пару років тому. І все-таки трохи очевидніше, що відбувається, ніж у питанні, і, здається, допомагає дивна людина, яка приземлилася тут.
c24w

Дякую за це, він також чудово працює git show!
Шейкель

@ c24w Згоден, все одно отримує те, що я хочу бачити на екрані.
Фараон шеф-кухаря

1
--no-prefixВаріант позбувається «/ а /» і «/ б /" призначення префіксів , які відображаються за замовчуванням. (пов'язана сторінка)
luckydonald

10

Примітка: повідомлення про git1.8.1rc1 (8 грудня 2012 року) включає:

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

щоб це могло допомогти тут генерувати більш повний контекст.


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варіант здається забруднити з об / шляху розбору), але --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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.