Jak jsem v projektech, které používají PHP 5.4 a
vyšší, převáděl starou syntaxi pro zápis polí array()
na
novou []
.
Samotný převod PHP souborů je úplně jednoduchý. Stačí použít PHP 5.4 Short Arrays Converter a v repozitáři zavolat:
php /php54-arrays/convert.php .
Nástroj zamění syntax ve všech souborech *.php
a
*.phpt
v aktuálním adresáři a také ve všech
podadresářích. Změněné soubory jsem pak komitnul (příklad).
Oříšek je ale rebasování dalších větví na takto změněný master.
Nakonec jsem na to šel přes filtry. Ale plně zautomatizovat se mi to nepovedlo.
Nejprve je vhodné všechny větve rebasovat na master těsně před samotnou změnou syntaxe.
Poté jsem si vytvořil filtr nazvaný phparray
, který bude
on-the-fly překládat v PHP souborech []
na array()
při checkoutu a obráceně při komitování. Tedy aby slučování probíhalo
při použití staré syntaxe, ale komitnulo se s novou.
Filtr se vytvoří v souboru .git/config
, v mém případě to
vypadalo takto:
[filter "phparray"] clean = c:/php/php.exe w:/php54-arrays/convert.php smudge = c:/php/php.exe w:/php54-arrays/convert.php -r required
Aby se filtr při slučování používal (ale i při každém checkoutu,
cherry-picku atd), je nutné doplnit do .git/config
ještě
následující:
[merge] renormalize = true
Filtr se bude aplikovat na soubory *.php
a *.phpt
,
což se definuje v souboru .git/info/attributes
(nepoužívejte
.gitattributes
, protože jde o dočasnou záležitost a nechceme
ji komitovat):
*.php filter=phparray *.phpt filter=phparray
Teď by ve větvi mělo fungovat git rebase master
. Bez
konfliktů, které by bylo nutné ručně řešit. Jenže ouha, konflikty se mi
vytvářely (na Windows; je možné, že na Linuxu to půjde) a když jsem je
chtěl řešit v TortoiseGit, objevovala se hláška, že na souboru
.git/index.lock
je zámek atd. Zkoušel jsem experimentovat
s dalšími nastaveními pro merge, ale bez výsledku.
Zkusil jsem dělat rebase ručně: což znamená nejprve větev resetnout na
master (git reset master --hard
) a pak jednotlivé komity
přidávat pomocí git cherry-pick <hash>
. Nedělal jsem to
z příkazové řádky, ale pomocí TortoiseGit. I nadále mi hlásil, že
některé soubory neumí automaticky sloučit a je vyžadován ruční zásah,
ale vždy stačilo soubor rozkliknout do TortoiseGitMerge a rovnou stisknout
Mark as resolved.
Bylo to otravné, ale fungovalo to a postupně jsem „rebasoval“ všechny
větve. Poté jsem filtr z .git/config
a
.git/info/attributes
smazal.
Proč to nešlo úplně automaticky, nemám páru, nicméně bylo snazší hodinu klikat, než dva dny studovat Git.
Komentáře
BlindAlley #1
Já tedy git neovládám, děláme v mercurialu, princip by měl být ale stejný. Jednoduchý postup převést syntax ve všech větvích a masteru zvlášť, všechno to commitnout a pak rebasovat/mergovat by měl také fungovat ne? Asi by tam vyskákaly konflikty ale na konci by se člověk měl dostat do stavu, kdy je všude nová syntax
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.