2012-04-12 7 views
8

A JGit-principianti-domanda:Commit una stringa con JGit

Io uso JGit per leggere un file (BLOB) da un repository e manipolare il suo contenuto. Dopodiché, voglio scrivere il nuovo contenuto con lo stesso nome di file nel repository come un nuovo commit. Ma come posso impegnare il nuovo contenuto con JGit?

mio pseudo-codice:

String gitUrl = "path/to/repository/.git"; 
Repository repository = new FileRepository(gitUrl); 
String filename = "test/seppl.txt"; 
blobId = getIdOf(filename); 
ObjectLoader object = repository.open(blobId, Constants.OBJ_BLOB); 
ObjectStream is = object.openStream(); 
String newContent = processStream(is); 
// How to commit the newContent in filename? 

Devo scrivere il newContent in un file e commettere questo file con il AddCommand e CommitCommand? O posso scrivere la stringa "al volo" nel repository con lo stesso nome file?

Esiste da qualche parte nel Web un esempio su come eseguire un commit con JGit?

+0

Come per un esempio di CommitCommand, suggerisco di dare un'occhiata alla mia risposta [qui] (http://stackoverflow.com/questions/6861881/jgit-cannot-find-a-tutorial-or-simple- esempio/10311069 # 10311069). –

+1

Raccomando anche di usare l'API di porcellana (ad es. 'AddCommand',' CommitCommand') come suggerito nelle risposte, ma se vuoi veramente impegnarti al volo_ potresti trovare questo articolo utile :: http: //www.codeaffine .com/2014/10/20/git-internals/ –

risposta

6

Penso che non ci sia un altro modo per commettere dati rispetto all'utilizzo di CommitCommand (ad eccezione della fusione o di operazioni molto specifiche).

Quindi, sì, è necessario apportare qualsiasi modifica al file, quindi aggiungerlo e confermarlo (utilizzando AddCommand e CommitCommand dall'API).

+0

Ok, ci proverò, perché sembra essere il modo più semplice e magari ottimizzarlo in seguito. – Sonson123

3

Si potrebbe voler usare Blob in Git. Questa tecnica viene utilizzata per memorizzare le chiavi PGP pubbliche al momento della firma dei tag. Sembra che il contenuto di tu debba ancora essere inserito in un file, ma può essere un file temporaneo. Il file non esisterà nella directory principale quando qualcuno fa un pull. Sarà una voce nell'albero come un blob.

http://book.git-scm.com/7_raw_git.html

Il -w dice di scrivere la voce con la restituzione del hash.

git hash-object -w myfile.txt 
6ff87c4664981e4397625791c8ea3bbb5f2279a3 

Aggiornamento

ho scremato attraverso questa voce sul mio cellulare, e quindi era meno attento al dettaglio che hai fornito. Sì, avresti bisogno di scrivere la stringa su un file, ma non dovresti doverla aggiungere come un normale file. Sospetto che JGit abbia la capacità di fare hash-object. Sembra che tu abbia già del codice per gestire una voce BLOB. Forse c'è una chiamata di livello superiore per l'oggetto hash in cui non si ha a che fare direttamente con il BLOB.

Considerando che tutto in Git si basa su hash di contenuto, direi che, anche se hai trovato un modo per scrivere direttamente la stringa, non dovresti. Dovresti ricominciare l'oggetto con lo stesso nome di file in modo tale da ottenere un nuovo hash e una voce aggiornata.

+0

Hm, molto interessante, grazie. Ma rimarrò con Add/CommitCommand perché è ora il più semplice. – Sonson123

3

Sì, naturalmente si può fare quello che vuoi, ma non solo usando Aggiungi/Commit in quanto sono parte della alto livelloPorcelein API che è solo un'API convenienza costruito in cima della bassa livello API. Quindi implementano solo i casi d'uso più comuni.

Quello che dovete fare è osservare l'implementazione di AddCommand e CommitCommand per vedere come usare l'API di livello inferiore per creare oggetti BLOB e quindi oggetti albero e poi oggetti di commit.

Vorrei in secondo luogo la raccomandazione che tu completamente read chapter 9 of the Pro Git book in modo che tu capisca correttamente come funziona Git a un livello basso.