-
1. Začetek
- 1.1 O nadzoru različic
- 1.2 Kratka zgodovina Gita
- 1.3 Kaj je Git?
- 1.4 Ukazna vrstica
- 1.5 Namestitev Gita
- 1.6 Prva nastavitev Gita
- 1.7 Pridobivanje pomoči
- 1.8 Povzetek
-
2. Osnove Git
- 2.1 Pridobivanje repozitorija Git
- 2.2 Snemanje sprememb v repozitorij
- 2.3 Pregled zgodovine potrditev
- 2.4 Razveljavljanje stvari
- 2.5 Delo z daljavami
- 2.6 Označevanje
- 2.7 Aliasi Git
- 2.8 Povzetek
-
3. Veje Git
- 3.1 Veje na kratko
- 3.2 Osnove vej in združevanja
- 3.3 Upravljanje vej
- 3.4 Poteki dela z vejami
- 3.5 Oddaljene veje
- 3.6 Ponovno baziranje
- 3.7 Povzetek
-
4. Git na strežniku
- 4.1 Protokoli
- 4.2 Pridobitev Gita na strežniku
- 4.3 Generiranje vaših javnih ključev SSH
- 4.4 Nastavitev strežnika
- 4.5 Prikriti proces Git
- 4.6 Pametni HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti gostovanja pri tretjih ponudnikih
- 4.10 Povzetek
-
5. Porazdeljeni Git
- 5.1 Porazdeljeni poteki dela
- 5.2 Prispevek k projektu
- 5.3 Vzdrževanje projekta
- 5.4 Povzetek
-
6. GitHub
-
7. Orodja Git
- 7.1 Izbira revizije
- 7.2 Interaktivno pripravljanje
- 7.3 Shranjevanje na varno (angl. stashing) in čiščenje
- 7.4 Podpisovanje vašega dela
- 7.5 Iskanje
- 7.6 Prepisovanje zgodovine
- 7.7 Demistifikacija ponastavitve
- 7.8 Napredno združevanje
- 7.9 Rerere
- 7.10 Razhroščevanje z Gitom
- 7.11 Podmoduli
- 7.12 Povezovanje v pakete
- 7.13 Zamenjava
- 7.14 Shramba poverilnic
- 7.15 Povzetek
-
8. Prilagoditev Gita
- 8.1 Konfiguracija Git
- 8.2 Atributi Git
- 8.3 Kljuke Git
- 8.4 Primer pravilnika, ki ga uveljavlja Git
- 8.5 Povzetek
-
9. Git in ostali sistemi
- 9.1 Git kot odjemalec
- 9.2 Migracija na Git
- 9.3 Povzetek
-
10. Notranjost Gita
- 10.1 Napeljava in keramika
- 10.2 Objekti Git
- 10.3 Reference Git
- 10.4 Packfiles (datoteke zmanjšanih podatkov)
- 10.5 Refspec
- 10.6 Protokoli prenosa
- 10.7 Vzdrževanje in obnovitev podatkov
- 10.8 Spremenljivke okolja
- 10.9 Povzetek
-
A1. Dodatek A: Git v drugih okoljih
- A1.1 Grafični vmesniki
- A1.2 Git v Visual Studio
- A1.3 Git v Visual Studio Code
- A1.4 Git v IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git v Sublime Text
- A1.6 Git v Bashu
- A1.7 Git v Zsh
- A1.8 Git v Powershellu
- A1.9 Povzetek
-
A2. Dodatek B: Vdelava Gita v vašo aplikacijo
- A2.1 Git v ukazni vrstici
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Dodatek C: Ukazi Git
- A3.1 Nastavitev in konfiguracija
- A3.2 Pridobivanje in ustvarjanje projektov
- A3.3 Osnove posnetkov
- A3.4 Veje in združevanje
- A3.5 Deljenje in posodabljanje projektov
- A3.6 Pregled in primerjava
- A3.7 Razhroščevanje
- A3.8 Popravljanje
- A3.9 E-pošta
- A3.10 Zunanji sistemi
- A3.11 Administracija
- A3.12 Orodja za sisteme napeljave
A2.3 Dodatek B: Vdelava Gita v vašo aplikacijo - JGit
JGit
Če želite uporabljati Git znotraj programa Java, je na voljo lastnosti polna knjižnica Git imenovana JGit. JGit je relativno lastnosti polna implementacija Gita napisanega izvorno v Javi in je široko uporabljena v skupnosti Java. Projekt JGit je pod okriljem Eclipse in njegov dom je moč najti na https://www.eclipse.org/jgit/.
Nastavitve
Na voljo je število načinov za povezavo vašega projekta z JGit in začetkov pisanja kode z njim.
Verjetno najenostavnejši je uporaba Mavena — integracija je dosežena z dodajanjem sledečih odrezkov znački <dependencies>
v vaši datoteki pom.xml
:
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>3.5.0.201409260305-r</version>
</dependency>
version
se bo sčasoma najverjetneje povečala, ko to berete; preverite https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit za posodobljene informacije repozitorija.
Ko je to enkrat narejeno, bo Maven avtomatično zahteval in uporabljal knjižnice JGit, ki jih boste potrebovali.
Če bi raje upravljali binarne odvisnosti sami, so vnaprej zgrajene zagonske datoteke JGit na voljo na https://www.eclipse.org/jgit/download. Vgradite jih lahko v svoj projekt z naslednjim pogonom ukaza:
$ javac -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App.java
$ java -cp .:org.eclipse.jgit-3.5.0.201409260305-r.jar App
Napeljava
JGit ima dva osnovna nivoja API-ja: napeljavo in keramiko. Terminologija za to dvoje prihaja iz samega Gita in JGit je v grobem razdeljen na iste vrste področij: API-ji keramike so prijazno ospredje za pogoste akcije na nivoju uporabnika (vrsta stvari, ki bi jih običajni uporabnik uporabil za orodje ukazne vrstice Git), medtem ko so API-ji napeljave namenjeni neposredni interakciji z objekti repozitorija nižjega nivoja.
Začetna točka za večino sej JGit je razred Repository
in prva stvar, ki jo boste želeli narediti, je ustvariti instanco iz njega.
Za repozitorij na osnovi datotečnega sistema (da, JGit omogoča ostale modele shranjevanja) je to urejeno z uporabo FileRepositoryBuilder
:
// Create a new repository
Repository newlyCreatedRepo = FileRepositoryBuilder.create(
new File("/tmp/new_repo/.git"));
newlyCreatedRepo.create();
// Open an existing repository
Repository existingRepo = new FileRepositoryBuilder()
.setGitDir(new File("my_repo/.git"))
.build();
Graditelj ima učinkovit API za ponujanje vseh stvari, ki jih potrebuje, da najde repozitorij Git, če vaš program točno ve ali pa ne, kje je lociran.
Uporablja lahko spremenljivke okolja (.readEnvironment()
), začne iz mesta v delovnem direktoriju in išče (.setWorkTree(…).findGitDir()
), ali pa samo odpre znani direktorij .git
kot zgoraj.
Ko imate enkrat instanco Repository
, lahko z njo naredite vse vrste stvari.
Tu je hiter primer:
// Get a reference
Ref master = repo.getRef("master");
// Get the object the reference points to
ObjectId masterTip = master.getObjectId();
// Rev-parse
ObjectId obj = repo.resolve("HEAD^{tree}");
// Load raw object contents
ObjectLoader loader = repo.open(masterTip);
loader.copyTo(System.out);
// Create a branch
RefUpdate createBranch1 = repo.updateRef("refs/heads/branch1");
createBranch1.setNewObjectId(masterTip);
createBranch1.update();
// Delete a branch
RefUpdate deleteBranch1 = repo.updateRef("refs/heads/branch1");
deleteBranch1.setForceUpdate(true);
deleteBranch1.delete();
// Config
Config cfg = repo.getConfig();
String name = cfg.getString("user", null, "name");
Tu se dogaja kar veliko, torej pojdimo skozi razdelke po enega na enkrat.
Prva vrstica dobi kazalec na referenco master
.
JGit avtomatično vzame dejanski ref master
, ki domuje v refs/heads/master
in vrne objekt, ki vam omogoča pridobiti informacije o referenci.
Dobite lahko ime (getName()
) in bodisi tarčo objekta neposredne reference (.getObjectId()
) ali pa referenco, ki kaže na simbolični ref (.getTarget()
).
Objekti ref so uporabljeni tudi, da predstavljajo reference oznak in objektov, tako da lahko vprašate, če je oznaka »olupljena« (angl. peeled), kar pomeni, da kaže na končno tarčo (potencialno dolgega) niza objektov oznake.
Druga vrstica dobi tarčo reference master
, ki je vrnjena kot instanca ObjectId.
ObjectId predstavlja zgoščeno vrednost SHA-1 objekta, ki lahko obstaja ali pa ne v objektni podatkovni bazi Git.
Tretja vrstica je podobna, vendar prikazuje, kako JGit upravlja s sintakso rev-parse (za več o tem, glejte razdelek Reference vej); lahko podate katerokoli določilo objekta, ki ga Git razume, in JGit bo vrnil veljavni ObjectId za ta objekt ali pa null
.
Naslednji dve vrstici prikazujeta, kako naložiti golo vsebino objekta.
V tem primeru kličemo ObjectLoader.copyTo()
, da pretoči vsebine objekta neposredno v stdout, vendar ObjectLoader ima tudi metode za pisanje tipa in velikosti objekta, kot tudi vrne bajtno polje.
Za velike objekte (kjer .isLarge()
vrne true
), lahko kličete .openStream()
, da dobite InputStreamu podoben objekt, ki lahko prebere surovi objekt podatkov, ne da povleče vse naenkrat v spomin.
Naslednjih nekaj vrstic prikazuje, kaj vzame, da ustvari novo vejo.
Ustvarimo instanco RefUpdate, nastavimo nekaj parametrov in kličemo .update()
, da sprožimo spremembo.
Neposredno temu kar sledi, je koda za izbris te iste veje.
Pomnite, da je .setForceUpdate(true)
obvezen, da to deluje; drugače bo .delete()
klic vrnil REJECTED
in nič se ne bo zgodilo.
Zadnji primer prikazuje, kako pridobiti vrednost user.name
iz nastavitvenih datotek Git.
Instanca Config uporablja repozitorij, ki smo ga prej odprli za lokalne nastavitve, vendar bo avtomatično odkril globalne in sistemske nastavitvene datoteke in prebral vrednosti tudi iz njih.
To je samo majhen primer celotnega API-ja napeljave; na voljo je veliko več metod in razredov.
Kar tu ni prikazano, je tudi način, kako JGit upravlja z napakami, kar je z uporabo izjem.
API-ji JGita včasih vržejo standardne izjeme Java (kot je IOException
), vendar je ponujena cela množica določenih tipov izjem JGIT (kot so NoRemoteRepositoryException
, CorruptObjectException
in NoMergeBaseException
).
Keramika
API-ji napeljave so nekoliko zaključeni, vendar jih je lahko težavno nizati skupaj, da se dosežejo skupni cilji, kot je dodajanje datoteke indeksu ali ustvarjanje nove potrditve.
JGit ponuja skupek višje nivojskih API-jev, da vam pri tem pomaga, in vnosna točka tem API-jem je razred Git
:
Repository repo;
// construct repo...
Git git = new Git(repo);
Razred Git ima lep skupek visoko nivojskih metod v stilu gradnje, ki so lahko uporabljene za konstrukcijo nekega lepega kompleksnega obnašanja.
Poglejmo primer — narediti nekaj, kot je git ls-remote
:
CredentialsProvider cp = new UsernamePasswordCredentialsProvider("username", "p4ssw0rd");
Collection<Ref> remoteRefs = git.lsRemote()
.setCredentialsProvider(cp)
.setRemote("origin")
.setTags(true)
.setHeads(false)
.call();
for (Ref ref : remoteRefs) {
System.out.println(ref.getName() + " -> " + ref.getObjectId().name());
}
To je pogosti vzorec z razredom Git; metode vrnejo objekt ukaza, ki vam omogoča verižiti klice metod, da nastavijo parametre, ki so izvedeni, ko kličete .call()
.
V tem primeru sprašujemo daljavo origin
za oznake, vendar ne pa za glave.
Bodite pozorni tudi na uporabo objekta za overjanje CredentialsProvider
.
Mnogi ostali ukazi so na voljo preko razreda Git, vključno z add
, blame
, commit
, clean
, push
, rebase
, revert
in reset
, vendar niso omejeni le na te.
Nadaljnje branje
To je samo majhen primer JGitove polne zmožnosti. Če vas zanima in želite izvedeti več, poglejte tu za informacije in navdih:
-
Uradna dokumentacija JGit API je na voljo na spletu na https://www.eclipse.org/jgit/documentation. To so standardni Javadoc, tako da jih bo vaš priljubljeni JVM IDE tudi zmožen namestiti lokalno.
-
Knjiga receptov JGit na https://github.com/centic9/jgit-cookbook ima mnoge primere, kako narediti določena opravila z JGitom.