Entferntes Git-Repository mit Java auslesen

Spitfire777

Bekanntes Mitglied
Hallo,

ich möchte ein über http erreichbares und mit Passwort geschütztes Git-Repository mit Java auslesen (also mit Authentifizierung). Dabei möchte ich nur in Erfahrung bringen, ob sich auf dem Repository etwas geändert hat (also wenn jemand etwas gepusht hat).

Habe mir mal JGit besorgt, aber ich komm dort nicht weiter. Wie kann ich das obige anstellen, ohne gleich das ganze Projekt zu klonen und runterzuladen?
 
Glaube nicht, dass das geht. Git arbeitet, soweit ich weiß, immer mit lokalen Daten/Repositories.
Du musst das Repository also zumindest einmal klonen. Danach kannst du dann git log drauf aufrufen. Wie genau das mit
JGit geht kann ich dir nicht sagen.
 
Ich kann dir soweit helfen, dass ich dir zeige, wie du auf ein lokales Repository mit JGIT zugreifen kannst. Da jGit in Eclipse in Verbindung mit eGit genutzt wird, bin ich mir ziemlich sicher, dass jGit auch auf HTTP mit Authentifizierung zugreifen kann. Wie das geht, musst du noch rausfinden: Du wirst sehr wahrscheinlich den FileRepositoryBuilder aus meinem Beispiel durch was passendes ersetzen müssen:
Java:
private void checkRepo(String repo, long time) throws IOException, NoHeadException {
		logger.debug("checkRepo: "+repo);
		FileRepositoryBuilder builder = new FileRepositoryBuilder();
		Repository repository = builder.setGitDir(new File(repo))
		  .readEnvironment() // scan environment GIT_* variables
		  .findGitDir() // scan up the file system tree
		  .build();
		
//		long sevenDays = 4*24*60*60*1000;
		Git git = new Git(repository);
		Iterable<RevCommit> log = git.log().call();
		long newtime = gc.getRepositories().get(repo);

		for(RevCommit commit : log){
			if((commit.getCommitTime()*1000L) <= time )
				break;
			logger.debug("notify Commit: "+commit.getId() + " - " + commit.getFullMessage());
			if((commit.getCommitTime()*1000L) > newtime)
				newtime = (commit.getCommitTime()*1000L);
			
			System.out.println(new Date(commit.getCommitTime()*1000L) + "; " +commit.getFullMessage() + "; " + commit.getAuthorIdent().getEmailAddress() + "; " + commit.toObjectId().getName());
			String diffTxt = "<p style=\"font-family:verdana,arial; font-size: 10px;\">";

			DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
			df.setRepository(repository);
			df.setDiffComparator(RawTextComparator.DEFAULT);
			df.setDetectRenames(true);
			List<DiffEntry> diffs = df.scan(commit.getParent(0).getTree(), commit.getTree());
			
			for (DiffEntry diff : diffs) {
				
				if(diff.getChangeType() == ChangeType.DELETE)
					diffTxt = diffTxt + MessageFormat.format("<b>{0}</b>: {1}<br />", diff.getChangeType().name(), diff.getOldPath());
				else 
					diffTxt = diffTxt + MessageFormat.format("<b>{0}</b>: {1}<br />", diff.getChangeType().name(), diff.getNewPath());
			}
			diffTxt = diffTxt+"</p>";

			String commitMsg = "<p style=\"font-family:verdana,arial; font-size: 11px;\">"+new Date(commit.getCommitTime()*1000L) + "</p><p style=\"font-family:verdana,arial; font-size: 11px;\"><b> " +commit.getFullMessage()+"</b></p>";
			
			try {
				File f = new File(repo);				
				String betreffText = "neuer Commit in " + f.getName();
				String logText = "";
				for(String rec : gc.getReceipients()){
					logText += rec+"; ";
					SendMail.postMail(rec, betreffText, (commitMsg+diffTxt), commit.getAuthorIdent().getEmailAddress());
				}
				logger.debug("sendTo: "+logText);
			} catch (MessagingException e) {
				e.printStackTrace();
			}	
		}
		
		gc.getRepositories().put(repo, newtime);
	}

Code:
gc
ist eine Instanz einer Klasse die meine Config lädt und speichert.
Code:
SendMail
verschickt E-Mails.
Der Rest sollte jGit, log4j und Java sein ... also keine Klassen von mir
 

Neue Themen


Zurück
Oben