JGit und EGit werden erwachsen

Beispiel: Starten eines Git Daemon

Als einfachstes Beispiel für einen Git-Server zeigt Listing 2, wie ein Git Daemon gestartet werden kann. Für den Git-Transport über HTTP bietet JGit die Klasse GitServlet an, die das Smart HTTP Protocol implementiert. Damit lässt sich unter Verwendung eines Standard-Servlet-Container wie Jetty oder Tomcat in ähnlicher Weise leicht ein Git-Server für das HTTP-Protokoll realisieren. Wie in Listing 2 zu erkennen, setzt resolver.exportDirectory(root) das Directory, unter dem die zu exportierenden Repositories liegen. resolver.setExportAll(true) exportiert alle Repositories unter dem root-Verzeichnis. Der Git Daemon kann auch ganz ohne eigene Entwicklung von der JGit-Konsole [4] gestartet werden: $ jgit daemon /tmp/git/ –export-all –listen localhost –port 9418 startet den Git Daemon und exportiert alle Repositories, die unter dem Directory /tmp/git/ gefunden werden. Mit jgit daemon -h können Sie die Syntax für die Angabe weiterer Parameter finden.

Listing 2
// configure from where to serve repositories
final FileResolver resolver = new FileResolver();
File root = new File("/tmp/git/");
System.out.println(MessageFormat.format("exporting {0}", root.getAbsolutePath()));
resolver.exportDirectory(root);
resolver.setExportAll(true);
  
// create daemon
final Daemon d;
d = new Daemon(new InetSocketAddress(HOST, PORT));
  
// configure daemon
PackConfig packConfig = new PackConfig();
// ... skipped loading of configuration from file
int threads = packConfig.getThreads();
if (threads 
Beispiel: Traversierung der Historie

Mit dem Porcelain API kann die Historie folgendermaßen traversiert werden:

File dir = new File(REPO_PATH);
Git git = Git.open(dir);
for (RevCommit c : git.log().call())
  System.out.println("Found commit: " + c.getShortMessage());

Unter der Haube wird dabei ein RevWalk für die Traversierung des Commit-Graphen benutzt. Für spezielle Anforderungen, die vom LogCommand nicht abgedeckt werden, kann es nötig sein, mit dieser Klasse direkt zu arbeiten, da sie viele Möglichkeiten bietet, die Traversierung zu konfigurieren (Exception Handling ist im Beispiel zur Vereinfachung weggelassen). In Listing 3 wird die Historie vom aktuellen HEAD zurück bis zum Tag v1.1 traversiert.

Listing 3
Repository repo = FileRepository("/path/to/repo/.git/");
RevWalk walk = new RevWalk(repo);

// define filter to configure the walk if you only want 
// to see commits which affected certain pathes
List pathFilters = new ArrayList();
pathFilters.add(PathFilter.create("relative/path/in/workingtree"));
pathFilters.add(PathFilter.create("another/path"));
walk.setTreeFilter(AndTreeFilter.create(
  PathFilterGroup.create(pathFilters), TreeFilter.ANY_DIFF));

ObjectId headId = repo.resolve(Constants.HEAD);
if (headId == null)
  throw new NoHeadException("missing HEAD");

// define start and end of the traversal
AnyObjectId startCommit = repo.resolve("HEAD");
AnyObjectId stopCommit = repo.resolve("refs/tags/v1.1");
walk.markStart(walk.lookupCommit(startCommit));
walk.markUninteresting(walk.lookupCommit(stopCommit));

// walk the RevWalk to traverse history
for (RevCommit c : walk)
  System.out.println("Found commit: " + c.getShortMessage());
Beispiel: TreeWalk zur Traversierung der Filesystem-Hierarchie

Zur Traversierung von Tree-Objekten, die in Git eine Version eines versionierten Verzeichnisses repräsentieren, stellt JGit die Klasse TreeWalk zur Verfügung. Mit ihr kann man mehrere Bäume (z. B. den Working Tree und den Tree des Commits auf den HEAD zeigt) gleichzeitig zu traversieren, damit kann dann zum Beispiel effizient das Diff zwischen dem Working Tree und HEAD berechnet werden. Wenn der TreeWalk mit nur einem Baum, der zum Beispiel einem bestimmten Commit entspricht, konfiguriert wird, kann er dazu genutzt werden, die Filesystemhierarchie, die dieser Version des Repositorys entspricht, zu traversieren. In Listing 4 ist zum Beispiel die Traversierung der Hierarchie für den aktuell ausgecheckten Commit skizziert.

Listing 4
Repository repo = FileRepository("/path/to/repo/.git/");
RevWalk revWalk = new RevWalk(repo);
try {
  TreeWalk treeWalk = new TreeWalk(revWalk.getObjectReader());
  startWalk.setRecursive(true);

  // set path filters to restrict walk to some part of the hierarchy
  List paths = new LinkedList();
  paths.add("some/directory/");
  paths.add("another/directory/");
  startWalk.setFilter(PathFilterGroup.createFromStrings(paths));

  // load the commit object HEAD is pointing at
  RevCommit headCommit = revWalk.parseCommit(repo.resolve("HEAD"));
  // configure treeWalk with this tree
  treeWalk.addTree(headCommit);
   try {
    // walk the tree and get some data about its entries
    while (startWalk.next()) {
      final ObjectId id = treeWalk.getObjectId(0);           final FileMode mode = treeWalk.getFileMode(0);   
      final String path = treeWalk.getPathString());
      System.out.println("SHA1: " + id 
        + ", mode: " + mode 
        + ", path: " + path);
    } catch (IOException e) {
      // handle IO exception
    }
  } finally {
    treeWalk.release();  // release walk to free memory
  }
} finally {
  revWalk.release();  // release walk to free memory
}
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.