2012-10-04 5 views
12

Próbowałem na wiele sposobów sklonować repo z jGit (działa). Następnie zapisuję archiwum w repozytorium i próbuję dodać wszystkie (a git add *, git add -A lub coś podobnego) .. ale to nie działa. Proste pliki nie są dodawane do obszaru pomostowego.jGit - jak dodać wszystkie pliki do obszaru przemieszczania

Mój kod to tak:

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(); 

Co robię źle? Dzięki.


Wyjątek podczas próby co z 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) 

Odpowiedz

17

Prostym sposobem do debugowania to jest patrzeć na testach w AddCommand w JGit repo: AddCommandTest.java

Zobaczysz, że w celu dodania wszystkich plików wzór "*" nigdy nie jest używany, ale "." jest.
i jest używany w funkcji testowej o nazwie ... testAddWholeRepo()

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

Wyjątek (!):

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

jest dość wyraźne: trzeba dodać plik w non-gołego repo .

Zobacz test method testCloneRepository(), aby porównać z własnym klonem i sprawdzić, czy są jakieś różnice.

+0

dziękuję, ale mam wyjątek. Wstawię to w pytanie: – caarlos0

+0

@ caarlos0 odpowiedź edytowana – VonC

+0

Ale sklonowałem to jako niezarejestrowane repozytorium ... Nie podważam tego, co mam zrobić ... – caarlos0

1

To może być wieloznaczny, po prostu przeczytać javadoc dla polecenia ADD, wygląda wyślesz nazwę katalogu, aby dodać jej nie zawartość dziką kartę:

addFilepattern 

public AddCommand addFilepattern(String filepattern) 

Parametry: filepattern - Plik do dodania treści z. Można również podać nazwę wiodącego katalogu (np. Dir, aby dodać dir/file1 i dir/file2) w celu rekurencyjnego dodania wszystkich plików do katalogu. Oprawki (na przykład *.c) nie są jeszcze obsługiwane .

3

Miałem sytuację, w której musiałem przenieść plik f1 z bieżącego katalogu do innego katalogu o nazwie "temp". .. Po przeniesieniu pliku, nazywając git.add() addFilePattern („”) wezwania() działał w dziwny sposób, ponieważ stan git dało następujący wynik:

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 

Uznaje się, że nowy plik temp/Utworzono f1, ale nie wykryto, że plik został usunięty jako pierwszy.Był to być może dlatego, przesuwając plik może być postrzegane jako następująco

  • Usuwanie/Cięcie f1 plików
  • Tworzenie folderu o nazwie temp
  • Tworzenie/Wklejenie f1 plików

Potem przyszedł przez setUpdate(true), który szuka aktualizacji plików, które są już śledzone i nie będzie przesyłać nowych plików. (Sprawdź java-doc, aby uzyskać więcej informacji)

Więc musiałem zmienić swój kod na dwóch liniach, jak tak, aby git rozpoznać zarówno pliki dodane i zmodyfikowane (która obejmuje usuwanie):

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

git status daje teraz oczekiwany wynik:

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