2012-10-04 16 views
12

Ho provato in molti modi a clonare un repository con jGit (funziona). Quindi, scrivo alcuni archivi nel repository e ho provato ad aggiungere tutto (a git add *, git add -A o qualcosa del genere) .. ma non funziona. I file semplici non vengono aggiunti all'area di gestione temporanea.jGit - come aggiungere tutti i file all'area di staging

Il mio codice è simile a questo:

FileRepositoryBuilder builder = new FileRepositoryBuilder(); 
    Repository repository = builder.setGitDir(new File(folder)) 
      .readEnvironment().findGitDir().setup().build(); 
    CloneCommand clone = Git.cloneRepository(); 
    clone.setBare(false).setCloneAllBranches(true); 
    clone.setDirectory(f).setURI("[email protected]:test.git"); 
    try { 
     clone.call(); 
    } catch (GitAPIException e) { 
     e.printStackTrace(); 
    } 
    Files.write("testing it...", new File(folder + "/test2.txt"), 
      Charsets.UTF_8); 
    Git g = new Git(repository); 
    g.add().addFilepattern("*").call(); 

Che cosa sto facendo di sbagliato? Grazie.


eccezione durante il tentativo quello che con addFilePattern (""):

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: Bare Repository has neither a working tree, nor an index 
    at org.eclipse.jgit.lib.Repository.getIndexFile(Repository.java:850) 
    at org.eclipse.jgit.dircache.DirCache.lock(DirCache.java:264) 
    at org.eclipse.jgit.lib.Repository.lockDirCache(Repository.java:906) 
    at org.eclipse.jgit.api.AddCommand.call(AddCommand.java:138) 
    at net.ciphersec.git.GitTests.main(GitTests.java:110) 

risposta

17

Un modo semplice per eseguire il debug di questo è quello di esaminare le prove della AddCommand nel JGit repo: AddCommandTest.java

Vedrai che per aggiungere tutti i file il pattern "*" non viene mai usato, ma "." è.
ed è utilizzato nella funzione di test di nome ... testAddWholeRepo()

git.add().addFilepattern(".").call(); 

l'eccezione (!):

Exception in thread "main" org.eclipse.jgit.errors.NoWorkTreeException: 
Bare Repository has neither a working tree, nor an index 

è molto esplicito: è necessario aggiungere file in un repo non-nuda .

Vedere test method testCloneRepository() per confrontare con il proprio clone e vedere se c'è qualche differenza.

+0

grazie, ma ho ottenuto un'eccezione. Lo metterò nella domanda – caarlos0

+0

@ caarlos0 risposta modificata – VonC

+0

Ma io lo clonerò come un repository non-nudo ... Non capisco cosa dovrei fare ... – caarlos0

1

Potrebbe essere il jolly, ho appena letto il javadoc per il comando add, sembra si invia il nome di una directory al fine di aggiungere la sua non contenuti una wild card:

addFilepattern 

public AddCommand addFilepattern(String filepattern) 

Parametri: filepattern - File per aggiungere contenuto da. È inoltre possibile assegnare un nome di directory iniziale (ad esempio dir per aggiungere dir/file1 e dir/file2) per aggiungere tutti i file nella directory, in modo ricorsivo. Fileglobs (ad esempio *.c) non sono ancora supportati da .

3

Avevo una situazione in cui dovevo spostare un file f1 dalla directory corrente in un'altra directory chiamata "temp". .. Dopo aver spostato il file, chiamando git.add() addFilePattern ("") chiamata() ha agito in un modo strano dal momento che lo stato git ha dato il seguente risultato:

Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

    new file: temp/f1.html 

Changes not staged for commit: 
    (use "git add/rm <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    deleted: f1.html 

E 'riconosciuto che una nuova temperatura di file/f1 è stato creato ma non ha rilevato che il file è stato eliminato per primo.Questo è stato forse perché lo spostamento del file può essere visto come segue

  • Eliminazione/Tagliare il file f1
  • Creazione di una cartella denominata Temp
  • Creazione/incollare il file di f1

poi sono venuto attraverso lo setUpdate(true) che cerca gli aggiornamenti ai file che sono già stati tracciati e non metterà in scena nuovi file. (Check java-doc per maggiori informazioni)

Così ho dovuto cambiare il mio codice per due linee come così, al fine di git per riconoscere entrambi i file aggiunti e modificati (che include l'eliminazione):

git.add().addFilepattern(".").call(); 
git.add().setUpdate(true).addFilepattern(".").call(); 

git lo stato ora fornisce il risultato previsto:

renamed: f1.hml -> temp/f1.html 
Problemi correlati