web-dev-qa-db-fra.com

"fatal: patch corrompu à la ligne XX" lors de la mise en place d'une ligne unique

Le message d'erreur suivant s'affiche lorsque j'essaie de mettre en scène une ou plusieurs lignes à l'aide de l'interface graphique (clic droit -> lignes d'étape pour la validation). Ce n'est pas la première fois que cela m'arrive, et j'en ai trouvé d'autres qui y font face. Cependant, je n'ai pas trouvé comment le résoudre.

Est-ce que quelqu'un a déjà rencontré ce problème? est-ce que je peux faire quelque chose (la mise en scène de tout le fichier n'est pas une vraie solution)

Mise à jour: Voici un fichier qui me donne l'erreur suivante lorsque j'essaie de mettre en scène la ligne supprimée.

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:src="@drawable/texture"
    Android:tileMode="repeat"
-   Android:dither="true"
    >
</bitmap>
\ No newline at end of file

Voici le message d'erreur:

fatal: corrupt patch at line 14

étrangement l'amende suivante n'a même pas 14 lignes!? note le fichier de fin avec une nouvelle ligne n'a pas résolu le problème 

37
Kirill Kulakov

Apparemment, l'interface graphique de Git requiert que les fichiers se terminent par une nouvelle ligne lors de la mise en place de lignes individuelles .

Je suis à peu près sûr que, au moins à un moment donné, la mise en place de lignes individuelles s'est bien déroulée, même sans nouvelle ligne à la fin du fichier, mais apparemment, cela n'est plus possible. Je viens juste de rencontrer ce problème moi-même, le fait que les nouvelles lignes à la fin du fichier le corrigent et que leur suppression le cause.

43
Kyle

En fait, cela se produit souvent lorsque vous éditez des lignes "-".
Lorsque vous supprimez '-' et oubliez d’ajouter '' (espace) à la place

Ou, par erreur, vous ajoutez deux espaces et vous utilisez des "onglets" comme identifiant

Ouvrez votre patch et vérifiez que toutes les lignes que vous voulez laisser intactes commencent par '' (une espace)

J'ai vu que certaines personnes utilisaient --ignore-space-change--ignore-whitespace--whitespace=fix comme solution de contournement, mais vous ne devez pas mélanger cela.

Ouvrez votre patch et vérifiez que toutes les lignes que vous voulez laisser intactes sont démarrées avec '' (espace)

UPD

il est également possible que votre éditeur dispose de l'option: "Supprimer les espaces en fin de ligne" Ainsi, lorsque vous enregistrez un patch dans votre éditeur:

-Line with space at end <--- NOTICE: Here one space at the end
+Line with no space at end<--- Here no space

Votre éditeur supprime l'espace de fin et le correctif devient comme ceci:

-Line with space at end<--- Here no space. Patch will FAIL!!!
+Line with no space at end<--- Here no space also

Ce correctif va échouer car le fichier Origin n'a pas de ligne:

-Line with space at end<---

il a:

-Line with space at end <--- 

UPD2

Donc si dans votre patch à la ligne suivante

Android:tileMode="repeat"

Votre éditeur supprime l'espace de formation. Patch va échouer

12
Eugen Konkov

L’interface graphique de Git ne parvient pas à ajouter/supprimer des lignes de l’index lorsque le bloc avec lequel vous travaillez est trop gros (c’est-à-dire que trop de lignes successives ont été modifiées).

Ma solution de contournement: si les modifications ne sont pas un "mur de rose" (s'il y a des lignes non modifiées au milieu du morceau), allez dans edit> options et réduisez le nombre de lignes dans le contexte de diffs. Si cela ne fonctionne pas, vous êtes foutu; utilisez un autre outil (comme la ligne de commande, par exemple).

2
Zonko

Je recevais cette erreur lors de la mise en scène des mecs.

Les "espaces" mentionnés ici me rappellent que j'ai, dans mes options de git diff, "-w", qui saute des espaces en différant.

J'ai enlevé ce drapeau (en utilisant "Options ..." de git-gui) et j'ai pu mettre en scène des mecs sans l'erreur. Je l'ai ensuite rajouté (car je ne veux généralement pas voir de différences d'espacement lorsque j'examine ce qui a changé).

Je ne suis pas sûr que cela vous aidera, mais il est plutôt inoffensif d’essayer et facile à annuler. 

1
Mike B

J'ai eu ce problème parce que j'ai essayé d'ajouter une nouvelle ligne à mon correctif dans emacs et il a automatiquement supprimé la nouvelle ligne à la fin lorsque je l'ai enregistré. 

Si vous utilisez emacs pour ajouter une nouvelle ligne à la fin de votre patch, il est également possible de le supprimer à nouveau. J'ai ouvert un autre éditeur de texte pour ajouter ma nouvelle ligne et cela a fonctionné. 

0
stanri

Inspiré par la réponse de kyl191, j'ai trouvé une solution simple à ce problème:

  1. ajouter un caractère de nouvelle ligne à la fin de votre fichier

  2. cacher tous les changements

    git stash
    
  3. ajoutez à nouveau un caractère de nouvelle ligne à la fin de votre fichier, de sorte que vous ayez un caractère de nouvelle ligne dans votre fichier actuel ainsi que dans votre version cachée

  4. met en scène le morceau correspondant (contient uniquement votre nouvelle ligne)

    git stage <your file>
    
  5. pop vos changements de stash

    git stash pop
    

Maintenant, vous devriez être capable de mettre en scène des lignes simples via une interface graphique sans cette erreur. Cela fonctionne car après que vous ayez mis en scène uniquement la partie contenant une nouvelle ligne, le fichier diff de la version récupérée de stash voit déjà un fichier qui se termine par un caractère de nouvelle ligne.

0
xmoex