-
1. Pričetek
- 1.1 O nadzoru različic
- 1.2 Kratka zgodovina Git-a
- 1.3 Osnove Git
- 1.4 The Command Line
- 1.5 Git namesitev
- 1.6 Prva namestitev Git-a
- 1.7 Pridobitev pomoči
- 1.8 Povzetek
-
2. Osnove Git
- 2.1 Pridobitev repozitorija Git
- 2.2 Snemanje sprememb repozitorija
- 2.3 Pregled zgodovine pošiljanja
- 2.4 Razveljavljanje stvari
- 2.5 Delo z daljavami
- 2.6 Označevanje
- 2.7 Git aliasi
- 2.8 Povzetek
-
3. Veje Git
- 3.1 Veje na kratko
- 3.2 Osnove vej in združevanja
- 3.3 Upravljanje vej
- 3.4 Potek dela z vejami
- 3.5 Oddaljene veje
- 3.6 Ponovno baziranje (rebasing)
- 3.7 Povzetek
-
4. Git na strežniku
- 4.1 Protokoli
- 4.2 Pridobiti Git na strežnik
- 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 Tretje osebne opcije gostovanja
- 4.10 Povzetek
-
5. Distribuirani Git
- 5.1 Distribuirani poteki dela
- 5.2 Prispevanje projektu
- 5.3 Vzdrževanje projekta
- 5.4 Povzetek
-
6. GitHub
-
7. Orodja Git
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Povzetek
-
8. Prilagoditev Git-a
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git kljuke
- 8.4 An Example Git-Enforced Policy
- 8.5 Povzetek
-
9. Git in drugi sistemi
- 9.1 Git kot klient
- 9.2 Migracija na Git
- 9.3 Povzetek
-
10. Notranjost Git-a
- 10.1 Napeljava in porcelan
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Povzetek
-
A1. Appendix A: Git v drugih okoljih
- A1.1 Grafični vmesniki
- A1.2 Git v Visual Studiu
- A1.3 Git v Eclipse
- A1.4 Git V Bash-u
- A1.5 Git v Zsh
- A1.6 Git v Powershell-u
- A1.7 Povzetek
-
A2. Appendix B: Vključevanje Git-a v vašo aplikacijo
- A2.1 Git v ukazni vrstici
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
A2.3 Appendix B: Vključevanje Git-a 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 Git-a napisanega izvorno v Javi in je široko uporabljena v skupnosti Java. Projekt JGit je pod okriljem Eclipse in njegov dom je moč najti na http://www.eclipse.org/jgit.
Nastavitve
Na voljo je število načinov za povezavo vašega projekta z JGit in začetkom pisanja kode pod njim. Verjetno najenostavnejši je uporaba Maven-a - 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 najverjetneje povečevala tekom časa, ko to berete; preverite http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit za nalaganje
informaij 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 iz http://www.eclipse.org/jgit/download. Zgradite jih lahko v vaš projekt s pogonom ukaza sledeče:
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
Vodovod
JGit ima dva osnovna nivoja API-ja: vodovod in keramika. Terminologija za to dvoje prihaja iz samega Git-a in JGit je razdeljen v groben iste vrste področij: porcelan API-ji 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 vodovod API-ji so za interakcijo z objekti repozitorija nižjega nivoja direktno.
Začetna točka za večino sej JGit je razred Repository
in prva stvar, ki jo boste želeli narediti, da ustvarite instanco iz njega.
Za repositorij na osnovi datotečnega sistema (da, JGit omoogoč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, bodisi ali ne vaš program točno ve, 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.
Enkrat ko imate instanco Repository
, lahko z njim naredite vse vrste stvari.
Tu je hitro vzorčenje:
// 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 kar veliko dogaja, torej pojdimo skozi po eno sekcijo na enkrat.
Prva vrstica dobi kazalec na referenco master
.
JGit avtomatično vzame dejanski master ref, ki domuje v refs/heads/master
in vrne objekt, ki vam omogoča ujeti informacije o referenci.
Dobite lahko ime (getName()
) in bodisi tarčo objekta direktne reference (.getObjectId()
) ali referenco, ki kaže na simbolični ref (.getTarget()
).
Objekti ref so tudi uporabljeni, da predstavljajo reference značk in objektov, tako da lahko vprašate, če je značka “peeled” - olupljena, kar pomeni, da kaže na končno tarčo (potencialno dolgega) niza objektov značke.
Druga vrstica dobi tarčo reference master
, ki je vrnjena kot instanca ObjectId.
ObjectId predstavlja SHA-1 razpršitev objekta, ki lahko ali ne obstaja v podatkovni bazi objekta Git.
Tretja vrstica je podobna, vendar prikazuje kako JGit upravlja s sintakso rev-parse (za več o tem, glejte Branch References); lahko podate katerokoli določilo objekta, ki ga Git razume in JGit bo vrnil bodisi veljavni ObjectId za ta objekt ali null
.
Naslednji dve vrstici prikazujeta kako naložiti golo vsebino objekta.
V tem primeru kličemo ObjectLoader.copyTo()
, da pretok vsebine objekta direktno 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 InputStream-u podoben objekt, ki lahko prebere surovi objekt podatkov brez, da potegne vse v spomin naenkrat.
Naslednjih nekaj vrstic prikazuje, kaj vzame, da ustvari novo vejo.
Ustvarimo instanco RefUpdate, nastavimo nekaj parametrov in kličemo .update()
, da sprožimo spremembo.
Direktno 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 ujeti user.name
vrednost iz nastavitvenih datotek Git.
Instanca Config uporablja repozitorij, ki smo ga odprli prej 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 vodovodnega API-ja; na voljo je veliko več metod in razredov.
Tudi kar ni prikazano tu, je način, kako JGit upravlja z napakami, kar je skozi uporabo izjem.
API-ji JGit-a včasih vržejo standardne Java izjeme (kot je IOException
), vendar so gostitelji JGIT določenih tipov izjem, ki so tudi ponujene (kot so NoRemoteRepositoryException
, CorruptObjectException
in NoMergeBaseException
).
Porcelan
API-ji vodovoda so nekoliko zaključeni, vendar jih je lahko težavno nizati skupaj, da se doseže skupne cilje, kot je dodajanje datoteke indeks-u ali ustvarjanje novega pošiljanja.
JGit ponuja skupek višje-nivojskih API-jev, da vam pri tem pomaga in vnosna točka tem API-je je razred Git
:
Repository repo;
// construct repo...
Git git = new Git(repo);
Razred Git ima lep skupek visoko-nivojskih builder-stilskih metod, 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 ukaz objektov, ki vam omogoča verižiti klice metod, da nastavijo parametre, ki so izvršene, ko kličete .call()
.
V tem primeru sprašujemo daljavo origin
za oznage, vendar ne glave.
Opazite tudi uporabo objekta CredentialsProvider
za overitev.
Mnogi ostali ukazi so na voljo preko razreda Git, vključno vendar ne omejeno na add
, blame
, commit
, clean
, push
, rebase
, revert
in reset
.
Nadaljnje branje
To je samo majhen primer JGit-ove polne zmožnosti. Če vas zanima in želite izvedeti več, poglejte tu za informacije in inspiracijo:
-
Uradna JGit API dokumentacija je na voljo na spletu na https://www.eclipse.org/jgit/documentation. To so standardni Javadoc, tako da vaš priljubljeni JVM IDE jih bo tudi zmožen namestiti lokalno.
-
JGit knjiga receptov na https://github.com/centic9/jgit-cookbook ima mnoge primere, kako narediti določena opravila z JGit-om.