web-dev-qa-db-fra.com

git: générer un seul patch sur plusieurs validations

Voici la situation:

  1. Nous avons créé un référentiel "privé" (par exemple notre référentiel) basé sur un référentiel git open source existant (par exemple, le référentiel source).

  2. Nous développons du code et avons environ 20 fusions dans notre référentiel. Ainsi, le dépôt est passé de "State_Initial" à "State_Current".

Désormais, pour des raisons commerciales, nous souhaitons confier tout notre développement à un tiers. Sur la base de certains problèmes juridiques, la seule option est de leur donner un fichier de patch "unique" avec toutes nos modifications. Il s'agit d'un patch écrasé entre "State_Initial" et "State_Current".

J'ai regardé autour de moi et j'ai trouvé

git format-patch -X

Mais, il génère des fichiers "n" .patch.

Existe-t-il un moyen de créer un seul fichier de correctif, de sorte que si nous créons un référentiel basé sur "source-repo" et appliquons le correctif, cela nous amène à "State_Current"?

10
SimpleCoder

La commande suivante crée un seul .patch fichier contenant plusieurs validations.

git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch

Vous pouvez ensuite l'appliquer ainsi:

git am foo.patch

Remarque: Assurez-vous d'utiliser ^.. au lieu de .. si vous voulez que le premier commit SHA soit inclus.

7
aleclarson

Créez une nouvelle branche nommée squashed qui a un seul commit écrasé . Cette branche aura exactement le même contenu que votre branche normale mais aucun de l'historique.

Regardez-le et si vous êtes satisfait, utilisez format-patch pour créer un fichier patch.

$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD

Il s'agit d'une opération non destructive et vous pouvez ensuite revenir directement à votre branche de développement normale. Vous pouvez tag la branche écrasée pour enregistrer une référence à ce que vous leur avez envoyé par e-mail, ou utiliser branch -D pour le supprimer si vous n'en avez plus besoin.

$ git branch -D squashed
0
John Kugelman

Si, pour une raison quelconque, vous ne souhaitez pas créer de branche jetable et écraser tous vos commits entre state_initial et state_current puis utilisez git format-patch, il existe une alternative. Si vous vous êtes dérivé de state_initial et que votre branche est rebasée au-dessus de la branche source:

git format-patch source_branch <patch_file_name>

Quand vous faites git am <patch_file_name>, il ne reconstruira pas l'intégralité de votre chaîne de validation. Mais ce fichier de patch sera une liste séquentielle de modifications. Si vous avez modifié et modifié des éléments sur plusieurs validations, il peut toujours être visible si quelqu'un examine le fichier de correctif.

0
Subhamoy S.