Voici la situation:
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).
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"?
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.
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
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.