Question

J'ai deux dépôts, l'un est le repo principal pour une bibliothèque, et l'autre est un projet en utilisant cette bibliothèque.

Si je fais une solution au projet dans le inféodée, je voudrais un moyen facile d'appliquer ce correctif vers l'amont.

L'emplacement du fichier est différent dans chaque dépôt.

  • repo principal: www.playdar.org/static/playdar.js
  • Projet: playlick.com/lib/playdar.js

J'ai essayé d'utiliser git format-patch -- lib/playdar.js sur le projet playlick et git am puis sur le repo principal playdar, mais les emplacements de fichiers différents dans le fichier patch soulevé une erreur.

Y at-il un moyen facile d'appliquer le patch à partir d'une donnée engager sur un fichier donné à un autre fichier arbitraire ailleurs?

Pour les points de bonus, si le fichier que vous souhaitez appliquer le patch n'est pas dans un dépôt git?

Était-ce utile?

La solution

Si vous modifiez manuellement le fichier de patch est hors de question ou infaisable, cela peut être fait avec des options standard (disponibles dans git apply, git format-patch et GNU patch).

  1. -p<n> supprime n les principaux répertoires des chemins dans le patch.

  2. Après le traitement -p, précèder de --directory=<root> root à chacun des chemins dans le patch avant d'appliquer.

Exemple

Ainsi, par votre exemple, de prendre un patch qui était à l'origine sur static/playdar.js et l'appliquer à lib/playdar.js, vous devez exécuter:

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'

Autres conseils

Le patch produit par git format-patch est simplement un texte file-- vous pouvez modifier les en-têtes diff afin qu'il modifie un chemin différent.

Ainsi, par exemple, il aurait produit quelque chose comme ceci:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js

Tout ce que vous avez à faire est de changer lib/playdar.js à static/playdar.js puis exécutez le patch par git am"

Le patch doit être lisible par l'utilitaire standard GNU patch pour les personnes qui n'ont pas git --- mais ne fonctionne pas format-patch avec le -M, etc. -C options pour produire renommer des correctifs dans ce cas, parce que le support pour eux est pas universel.

En supposant les deux projets sont des projets git, il semble que cette sous-modules serait la ajustement parfait pour vous. Cela permet à un projet git un lien dynamique vers un autre projet git, cuisson essentiellement un git droit dans un autre git, les deux ayant leur propre vie distinctes.

En d'autres termes, ajouter « repo principale » comme un sous-module dans « projet ». Chaque fois que vous vous engagez / pousser de nouvelles choses dans « repo principale », vous git pull juste les remettre dans « projet ».

Pour compléter Henrik de répondre , et d'aller pour le point de bonus

  

si le fichier que vous souhaitez appliquer le patch n'est pas dans un dépôt git?

Si vous avez accès aux répertoires du candidat de fichier pour un patch provenant d'un dépôt git, vous pouvez d'abord transformer cet arbre des répertoires / fichiers dans un dépôt git lui-même! ( « git init »: un dépôt git est juste un .git dans un répertoire racine après tout)
. Ensuite, vous définissez que repo comme sous-module pour votre projet principal.

Vous pouvez ajouter une nouvelle télécommande et tirer de lui. article avec des détails.

$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA

Je pense que sous-arbre est la meilleure solution pour votre problème

Tutorial 1

Tuorial 2

Vous pouvez simplement supprimer (renommer) temporairement le dépôt principal.

cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git

En utilisant l'option de --relative à format-patch peut améliorer l'abstraction (masquer les détails non pertinents sur le référentiel à partir duquel a été généré le patch).

[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'

J'ai trouvé l'option --3way être nécessaire lors de l'application du patch (pour éviter les erreurs de does not exist in index) - votre kilométrage peut varier. L'utilisation --directory=(...) est probablement nécessaire que si votre chemin cible n'est pas la racine du dépôt.

[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)

  • format-patch va créer un fichier patch par engagement à la branche actuelle depuis la 'base'.

  • La documentation de l'option --relative semble être manquantes dans certains cas , mais il semble fonctionner de toute façon (comme la version 2.7.4).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top