474 votes

git : le patch ne s'applique pas

J'ai un certain patch appelé my_pcc_branch.patch.

Lorsque j'essaie de l'appliquer, j'obtiens le message suivant :

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

Qu'est-ce que cela signifie ?

Comment puis-je résoudre ce problème ?

0 votes

Y a-t-il des fichiers AbstractedPanel.java.rej qui traînent ? Typiquement, cela signifie qu'une ligne bot a changé dans la source ainsi que dans le patch (ici la ligne 13 semble être affectée).

0 votes

Non, je n'ai pas trouvé de fichiers *.rej.

0 votes

Je ne sais pas pourquoi la réponse acceptée devrait résoudre le problème (je soupçonne donc que c'est un faux problème), mais ne le fait pas. has type 100644, expected 100755 suppose qu'il y a une erreur de permissions chmod quelque part ?

609voto

user1028904 Points 450

git apply --reject --whitespace=fix mychanges.patch a fonctionné pour moi.

Explication

En --reject demandera à git de ne pas échouer s'il ne peut pas déterminer comment appliquer un patch, mais plutôt d'appliquer les hunks individuels qu'il peut appliquer et de créer des fichiers de rejet ( .rej ) pour les hunks qu'il ne peut pas appliquer. Wiggle peut "appliquer [ces] correctifs rejetés et effectuer des diffs par mots".

En outre, --whitespace=fix vous avertira des erreurs d'espacement et essaiera de les corriger, plutôt que de refuser d'appliquer un hunk autrement applicable.

Ces deux options rendent l'application d'un patch plus robuste contre les défaillances, mais elles nécessitent une attention supplémentaire quant au résultat.

Pour l'ensemble de la documentation, voir https://git-scm.com/docs/git-apply .

11 votes

Cela a mieux fonctionné pour moi car cela n'a pas complètement modifié mon fichier.

13 votes

C'est génial. Il rejette juste ce qu'il ne peut pas résoudre lui-même et vous pouvez alors modifier manuellement les fichiers rejetés.

1 votes

Patch -p1 <mychanges.patch # applique les changements morceau par morceau. Si les changements échouent, un patch <sourcefile>.orig et <sourcefile>.rej sont créés et vous pouvez appliquer les changements manuellement. Je suppose que git apply --reject fait la même chose et que --whitespace=fix est magiquement meilleur.

391voto

Dmitri Pisarenko Points 1293

Johannes Sixt de la liste de diffusion msysgit@googlegroups.com a suggéré d'utiliser les arguments de ligne de commande suivants :

git apply --ignore-space-change --ignore-whitespace mychanges.patch

Cela a résolu mon problème.

29 votes

Quelqu'un peut-il m'aider et m'expliquer pourquoi cela fonctionne ? L'autre réponse n'a pas fonctionné pour moi, et j'avais exactement le même problème que celui décrit par l'auteur de la question. Quel est le rapport entre les attributs de fichier et le fait d'ignorer les espaces ?

1 votes

Utilisation de Windows powershell Un patch réalisé avec git diff a été appliqué avec succès comme suit : git diff HEAD..613fee -- monfichier.xml | git apply --ignore-space-change --ignore-whitespace, alors que l'enregistrement préalable de la sortie de la diff comme fichier n'a pas fonctionné, au cas où quelqu'un rencontrerait le même problème

2 votes

Essayez aussi -C1 pour l'appliquer, il réduit le contexte autour des ajouts considérés comme importants.

236voto

ruffin Points 1906

Si tout le reste échoue, essayez git apply 's --3way option .

git apply --3way patchFile.patch

--3.
Lorsque le correctif ne s'applique pas proprement, il faut se rabattre sur la fusion à 3 voies si le patch enregistre l'identité des blobs auxquels il est censé s'appliquer, et que nous ces blobs sont disponibles localement, en laissant éventuellement les marqueurs de dans les fichiers de l'arbre de travail pour que l'utilisateur puisse les résoudre. Ceci implique l'option --index, et est incompatible avec les options --reject et l'option --cached.

Le cas typique d'échec applique autant que possible le patch, et vous laisse avec des conflits à résoudre dans git comme vous le faites normalement. Probablement une étape plus facile que la méthode reject alternative.

64voto

vibneiro Points 347

Cette commande appliquera le correctif sans le résoudre, laissant les mauvais fichiers en tant que *.rej :

git apply --reject --whitespace=fix mypath.patch

Vous devez juste les résoudre. Une fois résolus, courez :

git -am resolved

9 votes

Comment résoudre *.rej - Tout ce que j'ai trouvé, c'est de faire les changements manuellement dans le fichier source et de supprimer ces fichiers. .rej des dossiers. Y a-t-il un autre moyen ?

1 votes

@coding_idiot Comme d'habitude, il suffit de vérifier les fichiers .rej, de les comparer avec les fichiers en conflit et enfin d'ajouter les fichiers corrigés à l'index (avec "git add FIXED_FILES").

4 votes

@coding_idiot vous pourriez utiliser déhanchement pour le résoudre. Par exemple : wiggle --replace path/to/file path/to/file.rej . Cette commande appliquera les modifications apportées par .rej au fichier original. Il crée également une copie du fichier original, comme path/to/file.porig . Veuillez consulter la documentation pour obtenir plus d'informations sur wiggle.

38voto

Pini Cheyni Points 63

Essayez d'utiliser la solution proposée ici : https://www.drupal.org/node/1129120

patch -p1 < example.patch

Cela m'a aidé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X