-
Notifications
You must be signed in to change notification settings - Fork 1
Viikon 5 paikanpaalla tehtavat
Jatkamme tänään 2 viikon tauon jälkeen gitin harjoittelua. Jos et tehnyt viikon 3 git tehtäviä tämän viikon tehtäviä ei ole mielekästä edes yrittää. Jos näin kävi, tee nyt viikon 3 tehtävät.
HUOM olethan jo konfiguroinut gitin viikon 3 ohjeen mukaan!
- Tee uusi hakemisto
- Tee hakemistosta git-repositorio
- muista koko ajan käyttää tärkeää komentoa git status
- muista myös git add -p muutoksia lisätessäsi
- Lisää hakemistoon tiedosto nimeltään README.md
- Kirjoita tiedostoon jotain
- käytä nano-editoria
- muotoile tekstisi markdown-notaatiota käyttäen, tee tiedostoon esim. jokin otsikko, tavallista tekstiä, joka sisältää tummennettuja ja vinonnettuja osuuksia
- näemme pian tekstin ruudulla muotoiltuna
- commitoi tiedosto
- muista aina commitoinnin yhteydessä lisätä tiedosto/muutokset commitoitavaksi
Monet ohjelmat generoivat tiedostoja ja hakemistoja omien konfiguraatioidensa ym. tallentamista varten. Yleensä ei ole mielekästä tallettaa niitä git-repositorioon joten ne on syytä määritellä .gitignore-tiedostossa ignoroitavaksi.
Käytetään nyt hieman graafista gedit-editoria. Avaa gedit ja varmista asetuksista (edit/preferences, huomaa että valikko löytyy laitoksen koneilla koko ruudun yläosasta), että se on määritelty tekemään automaattisia backup-tiedostoja
HUOM tee komennot täsmälleen ohjeen mukaisessa järjestyksessä
- editoi tiedostoa README.md geditillä
- lisää tekstiin esim. blockquote
- talleta muutokset
- ÄLÄ lisää ja commoittoi muutoksia vielä!
- vaan vasta siinä vaiheessa kun kohta gitignoroimme madot
- tarkista nyt hakemiston tilanne (komennolla ls) sekä git status
- hakemistoon olisi pitänyt syntyä "matotiedosto" README.md~
- matotiedoston pitäisi olla gitin suhteen tilassa Untracked
- kyseessä on geditin tiedoston vanhasta versiosta tekemä backup
Koska käytämme versionhallintaa, ei editorin tekemille backupeille ole käyttöä, versionhallintahan mahdollistaa paluun tiedoston vanhoihin versioihin.
-
gitignoraa matotiedosto
- eli tee hakemistoon tiedosto .gitignore ja merkkaa siihen README.md~ ignoroitavaksi
-
varmista nyt komennolla git status että README.md:n matoversio on ignoroitu
-
lisää ja commitoi tiedosto .gitignore
-
Tee repositoriosi sisälle uusi hakemisto dokumentointi ja sen sisälle tiedosto kaytto-ohje.md kirjoita tiedostoon jotain
-
lisää ja commitoi muutokset
-
editoi käyttöohjetta gedit-editorilla
-
huomaat, että jälleen syntyy matotiedosto
Ei ole käytännöllistä lisätä .gitignore-tiedostoon erikseen jokaista erillistä matotiedostoa. Onneksi voimme määritellä ignoroitavksi tiedostopatternin eli joukon samaan tapaan nimettyjä tai samassa hakemistossa sijaitsevia tiedostoja.
- määrittele ignoroitavaksi repositorion kaikki tiedostot, joiden nimi päättyy matoon eli merkkiin ~
- ohjeen sopivan tiedostopatternin tekemiseksi löydät täältä
- varmista, että käyttöohjeen mato ei näy git statuksessa
- tee joku uusi tiedosto repositorioon, editoi sitä tallennuksen jälkeen ja tallenna uudelleen
- varmista että mato ei tule versionhallinnan piiriin
- lisää ja commitoi muutokset repositorioon
Vaikka käytimme nyt gedit-editoria, kyseessä on niin huono editori, että sen käyttö ei ole suositeltavaa (esim. ohjelmoitaessa). Parempia editoreja ovat esim. Atom ja sublime text.
Gitin käytöstä on toki hyötyä jo harjoittelemallammekin tavalla, eli muodostamalla paikallisen koneen hakemistosta repositorio. Pääsemme kuitenkin nauttimaan kertaluokkaa suuremmista hyödyistä liittämällä repositoriomme internetissä olevaan etärepositorioon. Etärepositorion kautta repositorion tiedostot on helppo jakaa useiden koneiden tai/ja useiden käyttäjien kesken.
Internetin johtava paikka etärepositorioiden tallettamiseen on GitHub
- Luo itsellesi tunnus GitHubiin
- Luo uusi repositorio
- uuden repositorion luomistoiminto löytyy vasemman ylänurkan plus-symboolin alta
- Älä laita rastia kohtaan Initialize this repository with a README
Seuraavaksi haluamme liittää GitHubiin luodun repositorion paikallisen koneen repositorin etärepositorioksi.
- etärepositorion lisääminen onnistuu komennolla git remote add
- varmista, että kohdasta "Quick setup..." on valittu SSH
- kopioi GitHubiin avautuneesta näkymästä ylempi rivi kohdasta ...or push an existing repository from the command line
- omassa esimerkissäni rivi on
git remote add origin [email protected]:mluukkai-cs/otm2016-git-viikko5.git
- pastea rivi komentoriville ja suorita komento painamalla enter
- suorita komento git remote -v
- tulostus kertoo, että githubin etärepositorio on liitetty paikalliseen repositorioosi nimellä origin
mluukkai@melkki:~/otm_viikko5$ git remote -v
origin [email protected]:mluukkai-cs/otm2016-git-viikko5.git (fetch)
origin [email protected]:mluukkai-cs/otm2016-git-viikko5.git (push)
-
origin on etärepositorion oletusarvoinen nimi. Nimi voi olla mikä tahansa ja etärepositorioitakin voi olla useita
-
voimme siirtää repositoriomme tilan etärepositorioon komennolla git push
-
kokeillaan
mluukkai@melkki:~/otm_viikko5$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
Tulee pieni valitus ja git ehdottaa komennon parametrillista versiota. Kokeillaan sitä:
mluukkai@melkki:~/otm_viikko5$ git push --set-upstream origin master
Warning: Permanently added the RSA host key for IP address '192.30.253.112' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Jos olet jo asettanut julkisen avaimen esim. Tietokantojen perusteissa, pushauksen pitäisi toimia ja voit siirtyä seuraavaan kohtaan.
Pushaus ei edelleenkään toimi. Nyt kyse on siitä, että git haluaisi suorittaa julkisen avaimen autentikoinnin. Se ei kuitenkaan onnistu koska emme ole kertoneet gitille julkista salausavaintamme.
-
luo salausavain antamalla komentoriviltä komento ssh-keygen
- voit vastata kaikkiin kysymyksiin enterillä
-
syntyy kaksi salausavainta, salainen ja julkinen. ne sijoitetaan kotihakemistosi alla olevaan hakemistoon .ssh
-
mene hakemistoon ja katso hakemiston sisältöä
-
tiedosto id_rsa.pub sisältää julkisen avaimen, se on tarkoitus kopioida githubiin jotta avaimeen perustuva kirjautuminen onnistuisi
-
näet tiedoston sisällön komennolla cat id_rsa.pub
-
mene GitHubin asetussivulle klikkaamalla oikean yläkulman symbolista ja valitsemalla settings
-
valitse settingseistä SSH and GPG keys
-
luo uusi SSH-avain
- anna avaimelle joku title (esim. laitos) ja kopioi tiedoston id_rsa.pub sisältö kohtaan key
-
Suorita uudelleen push:
mluukkai@melkki:~/otm_viikko5$ git push --set-upstream origin master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (8/8), 714 bytes | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To [email protected]:mluukkai-cs/otm2016-viikko5.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
- nyt kaikki näyttää toimivan
-
mene GitHub-repositoriosi sivulle
- löydät kaikki repositoriosi valitsemalla GitHubin oikeasta yläkulmasta klikkaamalla "your profile" ja avautuvasta näkymästä "repositories"
-
huomaat että tiedostot näkyvät nyt repositorion sivulla. sivulle renderöityy repositorion juuressa olevan README.md:n sisältö markdown-muotoiltuna
-
voit editoida repositoriossa olevia tiedostoja suoraan githubin editorilla menemällä tiedoston sivulle ja painamalla kynäsymbolia
-
tee README.md:hen linkki käyttöohjeeseen, eli repositoriossa olevan hakemiston dokumentointi sisältämään tiedostoon kaytto-ohje.md
- ohje linkin muodostamiseen löytyy täältä
- käyttöohjeen urlin saat navigoimalla GitHubissa tiedostoon ja kopioimalla osoitteen selaimen osoiteriviltä
-
jos teet kaiken oikein, pääset README.md:ssä olevaa luomaasi linkkiä klikkaamalla käyttöohjeeseen
-
GitHubissa tekemämme muutokset ovat tehneet etärepositorioon uuden commitin
-
etärepositorio on nyt edellä paikallista repositorioamme
-
saamme tuotua muutokset paikalliselle koneelle komennolla git pull
-
kokeile komentoa ja varmista, että muuttunut sisältö on nyt paikallisessa repositoriossa
Jos GitHubiin päätyi matotiedosto gitignorauksesta huolimatta, pyydä ohjaajalta neuvoa miten saat sen pois... GitHubiin ei kannata laittaa mitään matotiedostojen tapaista roskaa, ne antavat erittäin epäammattilaismaisen vaikutelman.
-
Tee paikallisella koneella jokin muutos esim. tiedostoon README.md
-
lisää ja committaa muutos
-
vie muutokset githubiin komennolla git push
-
varmista GitHubista että muutokset näkyvät
-
Paikallinen repositoriosi ja GitHubin etärepositorio ovat jälleen samassa tilassa.
-
Lisää GitHubin avulla hakemistoon dokumentaatio uusi tiedosto, nimeltään maarittelydokumentti.md
- piirrä yuml.me:lla joku kaavio (valmiit esimerkkikaaviot käyvät)
- lisää kaavio kuvaksi määrittelydokumenttiin
-
Tee README.md:sta linkki uuteen tiedostoon
-
pullaa muutokset paikalliselle koneelle
- joskus käy niin, että paikallinen ja etärepositorio menevät epäsynkroniin, siten että molempiin tehdään yhtäaikaa uusi commit
- luodaan tälläinen tilanne
- tee paikalliseen repositorioon muutos tiedostoon README.md, lisää ja committoi muutos
- älä pushaa muutosta GitHubiin
- tee GitHubiin muutos johonkin muualle, esim. tiedostoon kaytto-ohje.md
- editoi siis tiedostoa suoraan GitHubissa
- yritä nyt pushata paikallisen repositorion muutokset githubiin
- seurauksena on virheilmoitus
mluukkai@melkki:~/otm_viikko5$ git push
To [email protected]:mluukkai-cs/otm2016-viikko5.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to '[email protected]:mluukkai-cs/otm2016-viikko5.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
mluukkai@melkki:~/otm_viikko5$
- Tulet törmäämään tähän varmaan useasti jatkossakin.
- Ongelma ei ole paha. Koska paikalliset ja GitHubin muutokset ovat kohdistuneet eri tiedostoihin selviämme helposti
- ensin pullaamme muutokset paikalliseen repositorioon komennolla git pull
- pullaaminen synnyttää ns. merge commitin jolle joudumme määrittelemään commit-viestin avautuvaan editoriin
- oletusarvoinen viesti käy, eli riittää että poistut editorista tallentaen muutokset
- ja pushaamme ne uudelleen githubiin
- nyt paikallinen ja etärepositorio ovat taas synkroonissa
- katso repositorion tilaa nyt komennolla gitk
- näet, että repositorion uusimmalla commitilla on nyt kaksi edeltäjää, paikallinen commit ja etärepositorion commit
Jos muutokset olisivat kohdistuneet samaan tiedostoon, olisi syntynyt hieman vakavampi tilanne, eli merge-konflikti. Konfliktit on pakko selvittää itse editorin avulla. On toki olemassa työkaluja, mergetooleja, jotka auttavat konfliktin selvittämisessä. Emme kuitenkaan mene tällä kurssilla merge-konflikteihin.
Nyrkkisääntönä kannattaa pitää aina sitä, että kun rupeat työskentelemään paikallisessa repositoriossa, pullaa ensin kaikki muutokset etärepositoriosta. Ja kun lopetat työskentelyn, pushaa muutokset etärepositorioon. Näin konflikteja ei yhden ihmisen työskentelyssä todennäköisesti tule.
Teimme äsken repositorion ensin paikallisesti ja linkitimme sen GitHubissa olevaan etärepositorioon. Usein tilanne on sellainen, missä haluaisimme GitHubissa jo olevan repositorion omalle koneellemme. Tähän on tarkoitettu gitin komento clone.
- Luo GitHubiin uusi repositorio, laita tällä kertaa rasti kohtaan "Initialize this repository with a README"
- GitHub luo repositorion sisälle README.md:n
- Lisää githubista repositorioon uusi tiedosto ja tee jotain muutoksia README.md:hen
- klikkaa kohtaa clone or download ja kopioi kloonausurl
- varmista että valittuna on "clone with SSH"
- mene sopvaan hakemistoon paikallisella koneella
- ÄLÄ kuitenkaan mene minkään git-repositorion sisälle
- anna kloonauskomento, parametrina kloonausurl
mluukkai@melkinkari:~$ git clone [email protected]:mluukkai-cs/otm2016-uusi.git
Cloning into 'otm2016-uusi'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (9/9), done.
Checking connectivity... done.
mluukkai@melkinkari:~$
Hakemistoosi syntyy uusi hakemisto, esimerkissä nimeltään otm2016-uusi, eli oletusarvoisesti nimi päätellään kloonausurlista. Uuden hakemiston nimen voi myös määritellä itse antamalla komennolle lisäparametrin:
git clone [email protected]:mluukkai-cs/otm2016-uusi.git hakemiston_nimi
Syntynyt hakemisto on nyt git-repositorio, jonka sisältö on sama kuin etärepositoriossa.
- tee repositorioon jokin muutos, lisää ja committoi
- push muutokset githubiin
- varmista GitHubista että muutos menee perille
- Luo NetBeansilla maven-muotoinen projekti, jonka sijoitat tehtävien alussa tekemäsi repositoriosi juureen.
- projektin sijainnin pystyt määrittelemään uuden projektin luomisdialogin kohdassa project location
- Jos loit sovelluksen oikeaan paikkaan git status -komennon tuloste on suunilleen seuraavanlainen
mluukkai@melkki:~/otm_viikko5$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
otmtestiappi/
nothing added to commit but untracked files present (use "git add" to track)
- lisää ja commitoi sovellus repositorioon
- tee sovellukselle yksinkertainen pääohjelma, eli luokka jonka sisällä on metodi
public static void main(String[] args) {
System.out.println("testing...");
}
- ÄLÄ vielä suorita ohjelmaa
- lisää ja commitoi sovellus repositorioon
- kuten muistamme, maven-projektien alle syntyy komentojen suorittamisen seurauksena hakemisto target
- emme halua hakemistoa git-repositorioomme, eli se tulee ignoroida
- suorita nyt ohjelma
- huomaat että sovelluksen alle muodostuu hakemisto target
- jos kokeilet mitä git status sanoo, huomaat että yllättäen git ignoroi syntyneen target-hakemiston
- NetBeans onkin lisännyt automaattisesti hakemiston ignoroitavksi
- Katso miltä .gitignore näyttää, lisää ja commitoi siihen tullut muutos
Haluamme suorittaa ohjelmamme komentoriviltä ja laittaa ohjelmamme julkisesti saataville, siten että kuka tahasa pystyy käyttämään ohjelmaa. Tämä onnistuu helposti jos paketoimme ohjelmamme jar-paketiksi
Jar-tiedosto on helppo luoda mavenilla. Tarvitsemme hieman konfigurointia.
- Lisää seuraava tiedoston pom.xml sisälle, esim. juuri ennen viimeistä riviä.
- tiedostoa kannattaa editoida NetBeansilla
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>fi.helsinki.cs.otmtestiappi.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Huomaa, että kohdan mainClass on oltava täsmälleen sama kuin pääohjelman sisältävän luokan täydellinen nimi:
- Saat nyt luotua jar-tiedoston antamalla komentoriviltä komennon mvn package
- komento luo hakemiston target sisälle kaksi jar-päätteistä tiedostoa, niistä oikea on se, jonka nimessä ei ole sanaa original
- ohjelman voi nyt suorittaa komennolla
java -jar jartiedoston_nimi.jar
- suorita ohjelma komentoriviltä
Jar-tiedosto siis generoituu hakemistoon target, eli se ei tallennu repositorioon. Miten saamme levitettyä ohjelmistomme potentiaalisille käyttäjille?
Yksi mahdollisuus on luoda GitHubiin release, eli julkaistu versio.
- klikkaa repositorion GitHub-sivulta kohtaa "0 releases"
- määrittele julkaisun tiedot ja lisää jar-tiedosto klikkaamalla kohtaa "Attach binaries..."
- jar-tiedosto kannattaa ehkä uudelleennimetä, mavenin generoima tiedostonimi on hieman ikävä
Nyt koodi on kenen tahansa ladattavissa menemällä GitHub-repositorioosi, ja klikkaamalla repositoriosivusi kohtaa "1 release" ja suoritettavissa komennolla java -jar tiedostonnimi.jar
olettaen että koneelle on asennettu Javan versio 1.8
Tämän kurssin osalta git-harjoittelumme loppuu tähän. Nyt opittu riittää hyvin yhden ihmisen käyttöön, esim. ohjelmoinnin harjoitustyön yhteydessä.
Gitissä on runsaasti hyödyllisiä ominaisuuksia joihin emme vielä tutustuneet. Nopeimmat voivat vielä tehdä seuraavan bonus-tehtävän.
Tutustu gitin brancheihin lukemalla tämä
- Tee projektiisi uusi branchi ja siirry branchiin
- Laajenna ohjelmaasi haluamallasi tavalla, lisää ja committoi muutokset uuteen branchiin
- Kun olet tyytyväinen muutoksiisi, pushaa branchi GitHubiin
- ym. tutoriaali ei kerro miten tämä onnistuu, googlaa ohje...
- Tee uuteen branchiin jokin muutos GitHubissa
- Pullaa muutokset paikalliseen repositorioon
- katso komennolla gitk -a miltä repositoriosi tällä hetkellä näyttää
- Mergeä branchiin tekemät muutoksesi masteriin
- katso repositorion tila mergeämisen jälkeen komennolla gitk -a
- laita vielä GitHub ajantasalle
Gitin opiskelua kannattaa ilman muuta jatkaa myös omin päin. Internetistä löytyy suuri määrä enemmän tai vähemmän hyviä tutoriaaleja. Seuraavassa muutama linkki
- https://www.atlassian.com/git/tutorials/
- http://learngitbranching.js.org
- http://ohshitgit.com
- valmiita gitignoremäärittelyjä erityyppisille projekteille https://github.com/github/gitignore