Als u een plug-in heeft gehost op de WordPress-repository, dan bent u vrij bekend met SVN en sommige van zijn opdrachten. In deze tutorial laat ik je zien hoe je Git kunt gebruiken, een ander versiecontrolesysteem dat door GitHub is gepopulariseerd, om je plug-in te publiceren en te onderhouden.
Git en SVN zijn beide voorbeelden van versiecontrolesystemen. De repository van WordPress gebruikt de laatste (als u een plug-in heeft gehost op WordPress, bent u bekend met het 'inchecken' om wijzigingen aan te brengen in deze repository). Ze laten je allebei toe om wijzigingen in je code bij te houden, maar er zijn grote verschillen tussen hen over hoe ze dit doen.
SVN vertrouwt op een enkele "centrale repository" van de code (in onze context: de WordPress plug-in repository). Telkens wanneer u uw invoegtoepassing wilt bewerken, moet u een lokale kopie maken, de wijzigingen aanbrengen en deze wijzigingen vervolgens in de WordPress-gegevensopslagruimte 'inchecken'..
Git is een gedecentraliseerd versiecontrolesysteem. In plaats van alleen een lokale kopie van uw plug-in te hebben, hebt u een volledige kloon van uw plug-in repository, compleet met al zijn wijzigingen. De repository bestaat nu op zichzelf op uw computer. U kunt wijzigingen vastleggen en bijhouden, wijzigingen terugdraaien of uw plug-in op verschillende locaties op uw lokale computer in verschillende richtingen aftakken. Pas als u tevreden bent om uw plug-in bij te werken, duwt u dan uw wijzigingen in uw WordPress-repository om ze openbaar te maken.
In deze tutorial veronderstel ik dat je een plug-in hebt gehost op de WordPress plug-in repository, of dat je tenminste je hosting aanvraag hebt goedgekeurd. Als u niet zeker weet hoe u uw plug-in door WordPress kunt laten hosten, raad ik u aan ons artikel over publiceren in de WordPress-repository voor invoegtoepassingen te lezen.
Er zijn veel argumenten voor en tegen het gebruik van Git over SVN (evenals gedecentraliseerde versiecontrolesystemen in het algemeen). Veel hiervan komen voort uit de fundamenteel verschillende manieren waarop Git en SVN veranderingen bijhouden. Een uitstekende, diepgaande analyse van Git en SVN is te vinden in CodeForest's Git vs SVN-artikel, maar voor de WordPress-ontwikkelaar:
Een nadeel van het gebruik van Git is dat het leuk wordt om te spelen met een SVN-repository. Het is niet zo erg dankzij git svn
, en dit artikel is hier om je er doorheen te leiden.
Als je dat nog niet hebt gedaan, wil je Git installeren. Hoe te installeren Git is redelijk goed gedekt in het Git Community-boek en het Pro Git-boek (beide uitstekend middelen als je nieuw bent bij Git). Hoe Git te installeren zal afhangen van uw besturingssysteem, net als welke GUI-programma's voor u beschikbaar zijn. In deze tutorial zal ik alles doen via de opdrachtregel - en ik moedig u aan hetzelfde te doen. Aan het einde van het artikel zal ik een aantal GUI-programma's voorstellen die je kunt gebruiken, maar meestal gebruik ik ze alleen om de vertakkingen van de repository te visualiseren.
Zoals eerder vermeld, check je met Git geen kopie van je plug-in - je kloont de repository, compleet met een geschiedenis van de aangebrachte wijzigingen, en al zijn vertakkingen en tags. Stap 1 is dan om de door WordPress gehoste repository van uw plug-in te klonen. Als voorbeeld zal ik een 'Post Type Archives Link' plug-in publiceren op basis van een eerdere tutorial. Dus (zodra u bent geaccepteerd in de WordPress-opslagplaats) opent u uw opdrachtregelinterface en navigeert u naar waar u de lokale versie van uw invoegtoepassing wilt opslaan. Ik ga het in een map plaatsen genaamd 'plugins'. Daar willen we Git vertellen waar we onze plug-in kunnen vinden. Op het moment van schrijven worden er bijna 20.000 plug-ins gehost in de WordPress-repository en meer dan 500.000 revisies. We willen niet wachten tot Git door elk van deze heen reist om onze plug-in te vinden. Dus eerst en vooral vinden we bij welke revisie onze plug-in begint (we willen dat het de hele geschiedenis is). Hiertoe krijgen we het eerste logboek van uw plug-in (wanneer het oorspronkelijk aan de repository was toegevoegd):
svn log -r 1: HEAD --limit 1 http://plugins.svn.wordpress.org/uw-plug-naam
Het zal een tijdje denken en dan zou je zoiets als dit moeten zien:
r520657 | plugin-master | 2012-03-19 03:56:31 +0000 (ma, 19 maart 2012) | 1 regel
Dat eerste nummer, '520657' voor mijn plug-in, is de eerste herziening. We zullen het gebruiken in de volgende opdracht die Git vertelt om de geschiedenis van onze plug-in te klonen. Vervang XXXXXX door uw revisienummer.
git svn clone -s -rXXXXXX --no-minimal-url http://plugins.svn.wordpress.org/your-plug-inc cd your-plugin-naam git svn fetch git svn rebase
De '-s
'vertelt Git dat het de standaard layout (Tag, Trunk, Branches) van een SVN-repository verwacht. De '--no-minimaliseren-url
"stopt het om buiten je insteekmap te kijken. Zorg ervoor dat het niet ontbreekt. Als je het weglaat, zou je de hele WordPress plug-in repository kunnen kopiëren. De -rXXXXXX
vertelt Git over welke herziening hij moet zoeken. Als je dat achterwege laat, zal Git de hele geschiedenis van de repository doorzoeken. Dat zijn meer dan 500.000 revisies. Ik heb dit een keer weggelaten en het duurde ongeveer twee uur. Als u erbij bent, duurt het maar een paar minuten.
Als het eenmaal klaar is, zou je moeten constateren dat het een map heeft aangemaakt genaamd 'your-plug-in-naam'in uw map met plug-ins'. Laten we een beetje verkennen. Navigeer naar de 'your-plug-in-naam'folder en voer een commando uit om te zien wat' branches 'zijn:
git branch -a
Hiermee worden alle filialen, lokaal en op afstand weergegeven. De enige lokale branch moet Master zijn (de asterisk geeft aan dat dit de branch is waar u zich bevindt). De andere tak (en) zijn de 'stam' en, als je die hebt, een vertakking voor elke tag (SVN behandelt tags als takken, maar Git is een beetje slimmer dan dat).
Naar je 'lokale map', 'plugins / your-plugin-naam', zou u uw plug-inbestanden moeten zien (indien aanwezig). Voordat we daar bestanden gaan maken of bewerken, gaan we een aparte branch maken om aan te werken.
Bijwerken: De bovenstaande commando's zijn bijgewerkt vanwege een probleem dat is opgemerkt in de reacties hieronder door Neerav en John Eckman. De bovenstaande code weerspiegelt nu de aanbeveling van Stephen Harris.
Een van de voordelen van het gebruik van Git is dat je eenvoudig een versie van je plug-in op GitHub kunt onderhouden. Dit maakt uw invoegtoepassing toegankelijker voor andere ontwikkelaars, die verbeteringen kunnen voorstellen of zelfs hun eigen wijzigingen kunnen aanbrengen die u naar uw eigen repository kunt slepen. Als je al bent ingesteld met GitHub, wil je op dit moment je plug-in naar je account pushen. Om dit te doen, maak je eerst een nieuwe repository op je GitHub-account en voeg je dit toe als een externe branch aan je lokale repository:
git remote add origin [email protected]:/ .git
'je gebruikersnaam'verwijst naar uw GitHub-gebruikersnaam en'your-repo-naam'verwijst naar de naam van de repository die je op GitHub hebt aangemaakt. Vervolgens duwt u gewoon uw lokale repository:
git push origin master
We zullen een nieuw bijkantoor 'werk' maken. Het is binnen deze tak dat we onze plug-in zullen veranderen, veranderingen zullen aanbrengen en functies zullen toevoegen, enz. Dit betekent dat onze 'Master'-tak in zijn oorspronkelijke staat wordt gehouden. Hierdoor kunnen we terugschakelen naar de hoofdtak en weer aftakken. Stel vooral dat er een grote fout in uw plug-in wordt aangetroffen terwijl u werkt aan een aantal nieuwe functies in uw 'werk'-branche. Je kunt terugschakelen naar je 'master' branch (die geen van de functies bevat waar je momenteel aan werkt), een fix maken voor de bug en die dan pushen naar de WordPress-repository. U kunt dan terugschakelen naar uw werkbranche en verdergaan waar u was gebleven. (Notitie: Git maakt geen kopieën van uw bestanden - er zal altijd maar één set bestanden in uw lokale map zijn. Wat deze bestanden bevatten, is afhankelijk van de branch waar u zich bevindt.)
Het is zelfs een goed idee om een branch te maken voor elke nieuwe functie die u toevoegt aan uw plug-in. Als je klaar bent, voeg je deze eenvoudig samen in de hoofdtak. Als dit 'conflicten' veroorzaakt, wordt u gevraagd deze handmatig op te lossen.
Maak eerst een tak met de naam 'werk':
git branch work
Dan 'afrekenen' (ga naar) tak 'werk':
git checkout werk
Een bericht zal u vertellen dat u bent overgeschakeld naar de 'werk'-branche. Gebruik nu uw favoriete teksteditor om de bestanden van uw plug-in te openen in uw lokale map (of maak ze aan als er nog geen zijn). Als je er een paar hebt gemaakt, wil je misschien weten welke bestanden je hebt gewijzigd. U doet dit met de eenvoudige opdracht:
git status
Dit zal veranderingen van weergeven bijgehouden en untracked bestanden. Er kunnen bestanden zijn waarvan je niet wilt dat Git de tracking onder controle krijgt (zoals tijdelijke bestanden), maar als je nieuwe bestanden aan de map hebt toegevoegd, moet je Git vertellen om ze te volgen. U kunt dit doen met de opdracht:
git add
Ik heb twee bestanden gemaakt 'Post-type-archive-links.php'en'metabox.js'in mijn lokale map, dus ik heb ze toegevoegd om Git te vertellen ze te volgen. Je moet ervoor zorgen dat je je volgt Leesmij het dossier.
Je kunt de wijzigingen ook bekijken sinds je laatste commit (dit is waar een GUI-programma erg handig wordt)
git diff
Zodra u de wijzigingen in uw lokale repository wilt vastleggen:
git commit -a -m "Did abc to xyz"
een (gedetailleerd) bericht van de wijzigingen in de commit.
In het proces van het aanbrengen van wijzigingen kun je (en zou) zo vaak mogelijk moeten committen - maar op een logische manier, bij voorkeur met één commit voor elk 'ding' dat je doet. Je moet er ook voor zorgen dat er geen duidelijke fouten in je commits zitten. Het 'ongedaan maken' van een commit is snel en pijnloos: u doet dit door een andere commit uit te voeren die de vorige committeert:
git zet HEAD terug
(U wordt gevraagd om een bericht om deze commit te beschrijven.)
Stel dat u nu in een positie bent waar u al uw wijzigingen in de SVN-repository wilt pushen. Voordat we dit doen, moeten we iets onthouden. Git moedigt je aan om vaak te committen, en het is een goede gewoonte om dit te doen ... voor ontwikkeling. Je WordPress plug-in repository is er echter voor distributie. Het heeft niet elke commit nodig. Sterker nog, dat is het echt niet willen het ook, omdat Otto (kernbijdrager van WordPress) waarschuwt:
"Als ik je betrap op [elke commit apart pushen], dan verbind ik je van WordPress.org. De SVN heeft alleen je laatste werkende versie nodig, niet de hele geschiedenis van de honderden veranderingen die je met Git hebt gemaakt. Maak uw wijzigingen in één commit plat. "
Om dit te voorkomen, voegen we alle commits samen in één commit wanneer we klaar zijn om naar de WordPress-repository te pushen. Er zijn een aantal manieren om dit te doen. We zullen onze veranderingen van onze werkbranche samenvoegen (en simultaan pletten) in onze meestertak. Dan verschijnen al onze veranderingen als één commit op de mastertak. We verwijderen vervolgens de werktak en duwen de hoofdtak naar de SVN-trunk van onze plug-in.
Eerst willen we terugschakelen naar de Master-tak:
git checkout master
Dan squash en voeg de werkfiliaalwisselingen samen tot de master:
git merge --squash werk
Als er wijzigingen in de hoofdtak zijn aangebracht, zijn er mogelijk conflicten in de samenvoeging. U wordt gevraagd om deze conflicten handmatig op te lossen voordat het samenvoegen kan worden voltooid. Voeg de wijzigingen samen nadat deze zijn samengevoegd (deze commit bevat alle commits uit onze branche):
git commit -a -m "Wijzigingen aangebracht a, b, c, d"
Ten slotte verwijderen we de werkbranche
git branch -D werk
Als u meerdere takken hebt die u wilt samenvoegen, kunt u dit voor elk van hen doen. Er zijn alternatieve methoden, die ik niet zal behandelen, van het afvlakken van je geschiedenis (zoals interactieve rebasen).
Op dit punt zou je, als je wilde, je laatste wijzigingen in je GitHub-account kunnen pushen:
git push -u originemeester
Om door te dringen naar de WordPress-repository, zorgen we eerst dat onze lokale repository 'up-to-date' is:
git svn rebase
Git zal dan je subversion repository gaan halen en eventuele wijzigingen daar samenvoegen met de wijzigingen die we zojuist hebben aangebracht. Normaal gesproken zouden er geen wijzigingen in de WordPress-repository moeten zijn, dus u zou het bericht moeten zien: De huidige filiaalmeester is up-to-date.
Nu kunnen we onze wijzigingen in de WordPress-repository pushen
git svn dcommit
Git kan u vervolgens vragen om uw WordPress.org-inloggegevens. Na invoer worden uw wijzigingen vastgelegd in de WordPress-repository. Binnenkort ontvangt u een e-mail van de WordPress-repository, die u op de hoogte stelt van de commits.
Momenteel zitten die wijzigingen in de kofferbak. Wat als we een nieuwe release van onze plug-in willen taggen? Bij het maken van de volgende versie voor uw plug-in moet u het ReadMe-bestand hebben bijgewerkt, zodat de stabiele tag verwijst naar uw nieuwe versie (zeg '2.0'). Je moet ook de headerinformatie van je plug-in hebben bijgewerkt in je your-plug-in-name.php het dossier. Als u dit bent vergeten, voert u de bovenstaande procedure uit, nadat u die wijzigingen hebt aangebracht.
Zodra uw 'trunk' volledig up-to-date is (inclusief de laatste versie-informatie), moeten we eenvoudigweg de nieuwe tag in de WordPress-repository maken:
git svn tag "2.0"
Hiermee kopieert u alles in uw kofferbak tags / 2.0 (wat je normaal bereikt in SVN met svn cp trunk tags / 2.0
).
Als u de release in uw lokale repository wilt taggen:
git tag -a 2.0 -m "Tagging 2.0"
Gelijk aan wat we met de WordPress-repository hebben gedaan, zorg ervoor dat onze repositories akkoord gaan en druk dan op onze wijzigingen en tags:
git pull --rebase oorsprong master git push oorsprong master git push origin --tags
Eindelijk zijn er een paar Git 'spiekbriefjes' die handig kunnen zijn: hier en hier.