Comment obtenir git diff avec un contexte complet?

114

Comment créer un patch adapté à l'examen dans un creuset?

git diff branch master --no-prefix > patch

Cela ne génère que 3 lignes de contexte. Alors je fais ce qui suit

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

Espérons que tous les fichiers auront moins de 2000 lignes. Existe-t-il un moyen de dire à git d'inclure toutes les lignes dans le fichier pour patch sans avoir à spécifier le maximum de lignes?

balki
la source
3
J'ai posté l'option -U <infinity> pour afficher le fichier entier, sous forme de question distincte stackoverflow.com/questions/28727424/...
Aleksandr Levchuk

Réponses:

54

Je sais que c'est vieux, mais je n'aime pas non plus les solutions codées en dur, alors j'ai testé ceci:

git diff -U$(wc -l MYFILE)

L'utilisation de -U semble être la seule façon d'aborder le problème, mais l'utilisation d'un nombre de lignes promet que cela fonctionnera même pour un petit changement dans un très gros fichier.

Ezra
la source
1
<n'est pas nécessaire. git diff -U$(wc -l MYFILE) MYFILE
balki
2
Merci @balki, j'ai essayé votre suggestion et j'ai remarqué que <pre> $ (wc -l MYFILE) </pre> s'étend au nombre de lignes suivi du nom du fichier, donc la deuxième utilisation du nom de fichier peut également être omise. Je mets à jour ma réponse pour refléter cela.
Ezra
4
C'est un diff, il existe deux versions du fichier. Et si la version absente du disque était deux fois plus longue? -U avec un très grand nombre n'est-il pas vraiment plus sûr?
Eloff
@Eloff, c'est vrai, le meilleur moyen serait de maximiser les longueurs, car les très grands nombres ont toujours le problème inverse. Cette solution suppose qu'aucune suppression contiguë supérieure à la taille actuelle du fichier sur le disque n'a été effectuée.
Ezra
3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEest une meilleure réponse qui analyse correctement la sortie de wcen obtenant uniquement le nombre de lignes sans espace, sans compter sur la sortie sans guillemets d'un sous-shell pour créer deux arguments, et fonctionne sur macOS / BSD.
anishpatel
94

Cela semble fonctionner assez bien:

git diff --no-prefix -U1000

Avec la mise en garde:

Le -Udrapeau spécifie des lignes de contexte. Vous devrez peut-être l'augmenter s'il y a plus de 1000 lignes entre vos modifications.

c24w
la source
16
L' -Uoption que vous suggérez est la même que celle --unified=utilisée par le demandeur. La seule différence est que vous spécifiez moins de lignes de contexte, 1000, que le demandeur utilisé, 2000. @balki voulait savoir comment augmenter le nombre à l'infini, mais vous suggérez de réduire le nombre de moitié. Pourquoi?
LS
4
@LS: oui, je me rends compte maintenant, mais j'ai oublié cela il y a quelques années. Pourtant, ce qui se passe est un peu plus évident que dans la question et semble aider l'étrange personne qui atterrit ici.
c24w
Merci pour cela, cela fonctionne également très bien avec git show!
Shakeel
@ c24w D'accord, me donne toujours ce que je veux voir à l'écran.
Chef Pharaoh
1
L' --no-prefixoption supprime les préfixes de destination «/ a /» et «/ b /» qui apparaissent par défaut. (page liée)
luckydonald
10

Remarque: l' annonce git1.8.1rc1 (8 décembre 2012) comprend:

Une nouvelle variable de configuration " diff.context" peut être utilisée pour donner le nombre par défaut de lignes de contexte dans la sortie du patch, pour remplacer la valeur par défaut codée en dur de 3 lignes.

cela pourrait aider, ici, à générer un contexte plus complet.

VonC
la source
7
Pourtant, cela n'a pas d'option pour dire `` Toutes les lignes du fichier ''
balki
3
Je soupçonne que mettre un grand nombre, cela simulerait "toutes les lignes"
VonC
7
"Je soupçonne que mettre un grand nombre, cela simulerait" toutes les lignes "" ... sauf quand ce n'est pas le cas et alors les choses se cassent. Tout est synonyme d'infini, et un très grand nombre n'est que cela - un nombre, pas l'infini.
Trenton
4

J'ai eu de l'inspiration et j'ai donc ajouté un alias git.

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

Mettre à jour:

Juste trouvé "git df" ne fonctionne pas parfois, en raison du changement de répertoire lors de l'exécution de l'alias git. (Voir les alias git fonctionnent dans le mauvais répertoire ). Voici donc la version mise à jour:

$ 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
Yun Wu
la source
0

Les solutions précédemment acceptées ne fonctionnent pas pour moi lors de la visualisation d'un fichier / commit spécifique (l' -Uoption semble perturber l'analyse de rev / chemin), mais --inter-hunk-context=fonctionne dans ce cas sur git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Si vous ne connaissez pas la taille du fichier, vous pouvez bien sûr le trouver avec wc -lau lieu de le coder en dur:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
Stefco
la source