Gerrit/Rozdělení odeslané změny
Někdy lidé odesílají obrovské záplaty, které by bylo lepší odeslat jako menší záplaty. Tato stránka vám pomůže zjistit, jak rozdělit odeslanou změnu a správně ji znovu odeslat v Gerritu. Tato stránka používá reálný případ, který se stal při migraci ze Subversion na Git v březnu 2012. Je založen na Gerrit change 3497, který zavádí tři různé změny: pomocníka pro ukládání do mezipaměti, způsob formátování doby trvání a transformaci z dvojitých uvozovek na jednoduché.
Protokol je opravdu jednoduchý, načtěte změnu, vytvořte novou větev a na ní si změnu vyberete. Pak přidejte pouze ty části, které vás zajímají. Stejný postup opakujte pro všechny části změny.
Získejte kód
Ujistěte se, že máte aktuální hlavní repozitář:
git checkout master
git pull --rebase
Další věc, kterou chceme udělat, je načíst kód od Gerritu.
Nejjednodušší je použít 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)$
Pak zjistěte vazbu sha1 zavedenou touto změnou pomocí příkazu git log.
Jednoduše musíme vypsat vazby, čímž se liší hodnota HEAD od hodnoty master:
review/catrope/cachedpage)$ git log --oneline master..HEAD
367d8f5 Resubmit the entire SpecialCachedPage/formatDuration saga as one big com
review/catrope/cachedpage)$
Nyní vytvořte tematickou větev a aplikujte záplatu lokálně.
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)$
Nyní si musíte vybrat část, která nás zajímá, a vytvořit novou vazbu, který se použije pro téma "cachedpage" (stránka uložená v mezipaměti).
Pro přidání souboru by se jako obvykle použila proměnná git add a pro výběr částí uvnitř souboru git add --patch.
I když chcete soubor přeskočit, stačí ho resetovat na git checkout -- FILENAME, tímto způsobem se nezahltí výstup git status, zatímco hledáte další části k uložení.
Jakmile dokončíte přípravu souborů a změnu pro dané téma.
Zkontrolujte rozdíl ve fázích git diff --cached a potvrďte ho.
Nakonec doplňte původní jméno autora pomocí git commit --amend --author "FirstName LastName <someone@example.org>".
U druhého tématu je to velmi podobné. Vytvořte novou větev a aplikujte na ni záplatu, kterou je třeba rozdělit:
git:cachedpage)$ git checkout master -b formatduration Switched to a new branch 'format duration' git:formatduration)$ git show --no-color 367d8f5 | git apply -
Nyní se můžeme zbavit veškerého kódu, který již byl vázán v předchozím tématu "cachedpage". K tomu ho použijeme jako reverzní opravu:
$ git show cachedpage | git apply --reverse - error: patch failed: maintenance/language/messages.inc:3935 error: maintenance/language/messages.inc: patch does not apply $
Budete se muset pečlivě podívat na záplatu, abyste to opravili. V tomto případě je to proto, že jsme museli ručně upravit část kódu, abychom rozdělili kód mezi témata cachedpage a formatduration (doba trvání formátování). Git ve výchozím nastavení odmítá záplatu, můžeme ji vynutit pomocí --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)$
Pohled na stav pracovní kopie již ukazuje, že soubory související s mezipamětí byly odstraněny a již se nějakou dobu ukládají. --reject vygeneroval soubor s názvem .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
Obsahuje řádek související s cachedpage.
Pak začněte přidávat soubory a bloky, které vás zajímají, s hodnotami git add a git add --patch.
Pak potvrďte změnu a nastavte původního autora (stejně jako výše).
Tento konkrétní případ měl pouze tři smíšená témata. Ve vaší pracovní kopii zbývá třetí změna. Takže vytvoření vazby je ještě jednodušší:
git checkout -b quotes master git add tests/phpunit/languages/LanguageTest.php git commit --author <SOMEONE>
submitting (odesílání)
Tato tři témata lze vidět pomocí:
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>
Takže máme tři tematické větve založené na masteru a nyní je můžeme všechny odeslat. Prohlédněte si každý z nich a odešlete je pomocí 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)$