web-dev-qa-db-fra.com

git create patch avec diff

J'ai essayé de faire

git diff 13.1_dev sale_edit > patch.diff

Ensuite, j'ai essayé de faire git apply patch.diff dans une autre branche, mais j'ai obtenu le patch ne s'applique pas. Comment créer des fichiers de correctifs à partir de différences que je peux utiliser avec git apply?

Erreurs reçues:

$ git apply --ignore-space-change --ignore-whitespace diff.diff 
diff.diff:9: trailing whitespace.

diff.diff:10: trailing whitespace.
    function set_change_sale_date() 
diff.diff:12: space before tab in indent.
      $this->sale_lib->set_change_sale_date($this->input->post('change_sale_date'));
diff.diff:14: trailing whitespace.

diff.diff:15: trailing whitespace.
    function set_change_sale_date_enable() 
warning: application/controllers/sales.php has type 100755, expected 100644
error: patch failed: application/controllers/sales.php:520
error: application/controllers/sales.php: patch does not apply
warning: application/language/english/sales_lang.php has type 100755, expected 100644
error: patch failed: application/language/english/sales_lang.php:134
error: application/language/english/sales_lang.php: patch does not apply
warning: application/libraries/Sale_lib.php has type 100755, expected 100644
error: patch failed: application/models/sale.php:170
error: application/models/sale.php: patch does not apply
warning: application/views/sales/register.php has type 100755, expected 100644
error: patch failed: application/views/sales/register.php:361
error: application/views/sales/register.php: patch does not apply

J'essaye ça sur Mac

38
Chris Muench

Essayez un:

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

Comme mentionné dans " git: le patch ne s'applique pas ", cela peut être dû à:

  • les fins de ligne diffèrent entre le système de fichiers local et le référentiel distant.
    Utilisateur core.eol dans .gitattributes le fichier est une bonne approche (voir " git forcer l'encodage du fichier lors de la validation ")
  • le bit d'exécution ('x').
    Cela peut vous amener à définir git config core.filemode false, suivi d'un git reset --hard HEAD (assurez-vous que vous n'avez pas de modifications non validées, sinon elles seraient perdues).
26
VonC

Vous pouvez appliquer le patch comme une fusion à 3 voies:

git diff 13.1_dev sale_edit > patch.diff
git apply -3 patch.diff

Il devrait faire apparaître le conflit afin que vous puissiez le résoudre manuellement. Ou vous pouvez aller avec une doublure, en passant le patch à appliquer directement:

git diff 13.1_dev sale_edit | git apply -3

Pour inverser le patch:

git diff 13.1_dev sale_edit | git apply -3 -R

(remarque: c'est la même chose que les commandes ci-dessus, sans le processus en deux étapes de création du fichier de patch)

git help apply

-3, --3way           
When the patch does not apply cleanly, fall back on 3-way merge if 
the patch records the identity of blobs it is supposed to apply to, 
and we have those blobs available locally, possibly leaving 
the conflict markers in the files in the working tree for the user 
to resolve...
16
Jeff Kiiza

Ici, vous devez l'essayer avec la branche avec laquelle vous avez diff.

git diff 13.1_dev sale_edit > patch.diff yourBranch()
1
User123456

Avec la version 1.9.1 de git, je vois des plaintes similaires lorsque j'utilise 'git apply' pour appliquer le correctif créé à l'aide de 'git diff'.

Il semble que 1.9.1 git ait des problèmes avec le mélange des espaces et des tabulations dans le fichier patch.

warning: squelched 1 whitespace error warning: 6 lines add whitespace errors.

@ La réponse de VonC n'aide pas et je reçois toujours les mêmes avertissements.

La solution la plus simple consiste à simplement utiliser la commande 'patch' qui applique avec succès toutes les modifications capturées dans la sortie 'git diff' au répertoire git cible.

$ patch --version GNU patch 2.7.1

1