Jump to content

Gerrit/Rozdělení odeslané změny

From mediawiki.org
This page is a translated version of the page Gerrit/split a submitted change and the translation is 100% complete.

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)$