2012-04-12 11 views
8

JGit-początkujących pytanie:Commit String z JGit

używam JGit do odczytu pliku (BLOB) z repozytorium i manipulować jego treść. Następnie chcę napisać nową zawartość o tej samej nazwie z powrotem do repozytorium jako nowe zatwierdzenie. Ale w jaki sposób mogę zatwierdzić nową zawartość za pomocą JGit?

Moja pseudo-kod:

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? 

Czy muszę napisać newContent do pliku i popełnić ten plik z AddCommand i CommitCommand? Czy mogę napisać ciąg "on-the-fly" do repozytorium pod tą samą nazwą pliku?

Czy w Internecie można znaleźć przykład, jak dokonać commitowania za pomocą JGit?

+0

Przykład CommitCommand, sugeruję, aby rzucić okiem na moją odpowiedź [tutaj] (http://stackoverflow.com/questions/6861881/jgit-cannot-find-a-tutorial-lub-simple- przykład/10311069 # 10311069). –

+1

Polecam również użycie API porcelany (np. 'AddCommand',' CommitCommand'), jak sugerują odpowiedzi, ale jeśli naprawdę chcesz popełnić _ w locie_, ten artykuł może być przydatny :: http: //www.codecode .com/2014/10/20/git-internals/ –

Odpowiedz

6

Myślę, że nie ma innego sposobu, aby zatwierdzić dane niż przy użyciu CommitCommand (z wyjątkiem operacji łączenia lub takich, które są bardzo specyficzne).

Więc, tak, powinieneś dokonać jakiejkolwiek zmiany w swoim pliku, a następnie dodać go i zatwierdzić (używając AddCommand i CommitCommand z API).

+0

Ok, spróbuję tego, ponieważ wygląda na to, że jest najłatwiejszy sposób i może później go zoptymalizować. – Sonson123

3

Możesz chcieć przyjrzeć się użyciu Bloba w Git. Ta technika służy do przechowywania publicznych kluczy PGP podczas podpisywania tagów. Wygląda na to, że nadal trzeba umieścić plik, ale może to być plik tymczasowy. Plik nie będzie istnieć w katalogu głównym, gdy ktoś wykona operację pull. Będzie to wpis w drzewie jako kropla.

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

-w informuje go napisać wpis wraz z powrotem hash.

git hash-object -w myfile.txt 
6ff87c4664981e4397625791c8ea3bbb5f2279a3 

Aktualizacja

mi odtłuszczone przez tego wpisu na moim telefonie, a więc była niższa następnie zwracać uwagę na szczegóły, który podałeś. Tak, musisz napisać ciąg do pliku, ale nie powinieneś dodawać go jak zwykłego pliku. Podejrzewam, że JGit ma możliwość robienia hash-object. Wygląda na to, że masz już kod do czynienia z wpisem BLOB. Być może istnieje wyższy poziom wywołania dla obiektu mieszającego, w którym nie zajmujesz się bezpośrednio obiektem BLOB.

Biorąc pod uwagę, że wszystko w Git opiera się na hashach zawartości, powiedziałbym, że nawet gdybyś znalazł sposób na napisanie ciągu bezpośrednio, nie powinieneś. Powinieneś ponownie polecić obiekt z tą samą nazwą pliku, aby uzyskać nowy skrót i zaktualizowany wpis.

+0

Hm, bardzo interesujące, dzięki. Ale pozostanę z poleceniem Dodaj/Polecenie, ponieważ jest teraz najłatwiejszy. – Sonson123

3

Tak, oczywiście można robić, co chcesz, ale po prostu nie używając Dodaj/Commit, ponieważ są one częścią wysokim poziomiePorcelein API który jest po prostu API wygoda zbudowany na najwyższym z nisko poziom interfejsu API. W ten sposób po prostu wdrażają najczęstsze przypadki użycia.

To, co musisz zrobić, to sprawdzić implementację AddCommand i CommitCommand, aby zobaczyć, jak używać interfejsu API niższego poziomu do tworzenia obiektów BLOB, a następnie obiektów drzewa i obiektów commit.

Poddałbym się zaleceniu, że dokładnie read chapter 9 of the Pro Git book, tak aby poprawnie zrozumieć, w jaki sposób Git działa na niskim poziomie.