Gerrit/Segmenter des modifications soumises
Parfois, il arrive de soumettre de grosses corrections qui auraient été mieux si elles avaient été présentées sous forme de patchs plus petits. Cette page vous aidera à découvrir comment diviser une correction que vous avez soumise et la soumettre à nouveau correctement dans Gerrit. Cette page utilise un cas réel qui s'est produit lorsque nous avons migré de subversion vers git en mars 2012. Il est basé sur Gerrit change 3497 qui introduit trois changements différents : un assistant de mise en cache, un moyen de formater la durée du temps et une procédure pour transformer les guillemets en apostrophes simples.
Le protocole est vraiment simple, récupérez la modification, créez une nouvelle branche et placez (cherry pick) la modification dessus. Puis ajoutez seulement les morceaux qui vous intéressent. Répétez le même processus sur toutes les parties de la correction.
Obtenir le code
Assurez-vous d'être synchronisé avec le dépôt principal :
git checkout master
git pull --rebase
La chose suivante que nous voulons faire est de récupérer le code de Gerrit.
La manière la plus facile de faire cela est d'utiliser git-review
:
git:master)$ git-review -d 3497
Downloading refs/changes/97/3497/5 from gerrit into review/catrope/cachedpage
Switched to branch 'review/catrope/cachedpage'
git:review/catrope/cachedpage)$
Ensuite recherchez le sha1 du commit introduit par cette modification en utilisant la commande git log
.
Nous devons simplement trouver les commit qui font que HEAD
est différent de master
:
review/catrope/cachedpage)$ git log --oneline master..HEAD
367d8f5 Resubmit the entire SpecialCachedPage/formatDuration saga as one big com
review/catrope/cachedpage)$
Maintenant, créez la branche du sujet et appliquez le correctif localement
git:review/catrope/cachedpage)$ git checkout master -b cachedpage Switched to a new branch 'cachedpage' git:cachedpage)$ git show --no-color 367d8f5 | git apply - $ git status # On branch cachedpage # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: includes/AutoLoader.php # modified: languages/Language.php # modified: languages/messages/MessagesEn.php # modified: languages/messages/MessagesQqq.php # modified: maintenance/language/messages.inc # modified: tests/phpunit/languages/LanguageTest.php # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # includes/CacheHelper.php # includes/actions/CachedAction.php # includes/specials/SpecialCachedPage.php no changes added to commit (use "git add" and/or "git commit -a") git:cachedpage)$
Vous devez maintenant choisir le segment qui nous intéresse pour créer un nouveau commit qui sera utilisé pour le sujet "page en cache".
Pour ajouter un fichier, on utilisait git add
comme d'habitude, git add --patch
pour sélectionner les morceaux à l'intérieur d'un fichier.
Même si vous voulez sauter un fichier, réinitialisez-le avec git checkout -- FILENAME
, de cette façon il ne viendra pas encombrer les sorties de git status
pendant que vous cherchez des segments supplémentaires à mettre en réserve.
Une fois que vous avez terminé de mettre en les fichiers en réserve et modifié le sujet.
Relire la différence de la réserve git diff --cached
et validez-la.
Remplissez éventuellement le nom de l'auteur original en utilisant git commit --amend --author "FirstName LastName <someone@example.org>"
.
Pour le deuxième sujet, c'est très similaire. Créez une nouvelle branche et appliquez la correction qui doit être segmentée :
git:cachedpage)$ git checkout master -b formatduration Switched to a new branch 'format duration' git:formatduration)$ git show --no-color 367d8f5 | git apply -
Nous pouvons désormais nous débarrasser de tout code qui a déjà été validé sous le sujet précédent "page en cache", pour ce faire nous allons l'appliquer comme un correctif inverse :
$ git show cachedpage | git apply --reverse - error: patch failed: maintenance/language/messages.inc:3935 error: maintenance/language/messages.inc: patch does not apply $
Vous devrez regarder attentivement le patch pour corriger cela. Dans ce cas, c'est parce que nous avons dû modifier manuellement un morceau pour segmenter le code entre les sujets de la page en cache et le format de la date. Git rejette un patch par défaut, nous pouvons le forcer avec --reject :
git:formatduration)$ git show cachedpage | git apply --reverse --reject - Checking patch includes/AutoLoader.php... Checking patch includes/CacheHelper.php... Checking patch includes/actions/CachedAction.php... Checking patch includes/specials/SpecialCachedPage.php... Checking patch languages/messages/MessagesEn.php... Checking patch languages/messages/MessagesQqq.php... Checking patch maintenance/language/messages.inc... error: while searching for: 'logging-irc' => 'For IRC, see bug 34508. Do not change', 'feedback' => 'Feedback', 'apierrors' => 'API errors', 'cachedspecial' => 'SpecialCachedPage', ); error: patch failed: maintenance/language/messages.inc:3935 Applied patch includes/AutoLoader.php cleanly. Applied patch includes/CacheHelper.php cleanly. Applied patch includes/actions/CachedAction.php cleanly. Applied patch includes/specials/SpecialCachedPage.php cleanly. Applied patch languages/messages/MessagesEn.php cleanly. Applied patch languages/messages/MessagesQqq.php cleanly. Applying patch maintenance/language/messages.inc with 1 rejects... Hunk #1 applied cleanly. Rejected hunk #2. git:formatduration)$
En regardant l'état de copie de travail, on voit déjà que les fichiers liés au cache ont été supprimés, ce qui permet déjà de gagner du temps. --reject a généré un fichier nommé .rej
git:formatduration)$ git status # On branch formatduration # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: languages/Language.php # modified: languages/messages/MessagesEn.php # modified: maintenance/language/messages.inc # modified: tests/phpunit/languages/LanguageTest.php # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # maintenance/language/messages.inc.rej
Il contient une ligne liée à la page en cache.
Puis commencez à ajouter les fichiers et le segment qui vous intéressent avec git add
et git add --patch
.
Ensuite, validez (commit) et déclarez l'auteur original (le même que celui ci-dessus).
Ce cas spécifique n'avait que trois sujets mélangés. Ce qui reste dans votre copie de travail est la troisième modification. Donc, créer un commit pour cela est même plus facile :
git checkout -b quotes master git add tests/phpunit/languages/LanguageTest.php git commit --author <SOMEONE>
Soumettre
Les trois sujets peuvent être vus avec :
git:quotes)$ git log --graph --decorate --oneline --all * 5605bf3 (HEAD, quotes) change double quotes to single quotes | * 5200440 (formatduration) duration formatter, makes time in sec easy to read |/ | * e2ef042 (cachedpage) CacheHelper: facilitate caching handling on a page |/ * d859541 (gerrit/master, master) Use local context to get messages | * 367d8f5 (review/catrope/cachedpage) Resubmit the entire SpecialCachedPage/fo |/ * 458f162 Merge "[LanguageConverter] Added some cache code based on the proble <snip>
Nous avons donc les trois branches de sujets basées sur le master et nous pouvons maintenant les soumettre tous. Vérifiez chacun d'eux et soumettez-les à l'aide de git-review :
git:master)$ git checkout cachedpage Switched to branch 'cachedpage' git:cachedpage)$ git-review --no-rebase -f remote: Resolving deltas: 14% (2/14) remote: remote: New Changes: remote: https://gerrit.wikimedia.org/r/c/mediawiki/core/+/4628 remote: To gerrit.wikimedia.org * [new branch] HEAD -> refs/for/master/cachedpage Switched to branch 'master' Deleted branch 'cachedpage' git:master)$ git checkout formatduration Switched to branch 'formatduration' amusso@aeriale:/srv/trunk(git:formatduration)$ git-review --no-rebase -f remote: Resolving deltas: 0% (0/12) remote: remote: New Changes: remote: https://gerrit.wikimedia.org/r/c/mediawiki/core/+/4629 remote: To gerrit.wikimedia.org * [new branch] HEAD -> refs/for/master/formatduration Switched to branch 'master' Deleted branch 'format duration' git:master)$ git checkout quotes Switched to branch 'quotes' git:quotes)$ git-review --no-rebase -f remote: Resolving deltas: 0% (0/5) remote: remote: New Changes: remote: https://gerrit.wikimedia.org/r/c/mediawiki/core/+/4630 remote: To gerrit.wikimedia.org * [new branch] HEAD -> refs/for/master/quotes Switched to branch 'master' Deleted branch 'quotes' git:master)$