2012-04-12 28 views
8

Câu hỏi JGit-beginner:Cam kết một chuỗi với JGit

Tôi sử dụng JGit để đọc tệp (BLOB) từ kho lưu trữ và thao tác nội dung của nó. Sau đó, tôi muốn viết nội dung mới có cùng tên tệp quay lại kho lưu trữ dưới dạng một cam kết mới. Nhưng làm thế nào tôi có thể cam kết nội dung mới với JGit?

My pseudo-code:

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? 

Tôi có phải viết newContent vào một tập tin và cam kết tập tin này với AddCommandCommitCommand? Hoặc tôi có thể viết chuỗi "on-the-fly" vào kho lưu trữ dưới cùng tên tệp không?

Có bất kỳ vị trí nào trong web làm ví dụ về cách thực hiện cam kết với JGit không?

+0

Ví dụ về một CommitCommand, tôi đề nghị bạn có một cái nhìn vào câu trả lời của tôi [ở đây] (http://stackoverflow.com/questions/6861881/jgit-cannot-find-a-tutorial-or-simple- ví dụ/10311069 # 10311069). –

+1

Tôi cũng khuyên bạn nên sử dụng các API sứ (tức là 'AddCommand',' CommitCommand') như được đề xuất trong các câu trả lời, nhưng nếu bạn thực sự muốn cam kết _on fly_ bạn có thể thấy bài viết này hữu ích :: http: //www.codeaffine .com/2014/10/20/git-internals/ –

Trả lời

6

Tôi nghĩ rằng không có cách nào khác để thực hiện bất kỳ dữ liệu nào hơn là sử dụng CommitCommand (trừ việc hợp nhất hoặc các thao tác như vậy rất cụ thể).

Vì vậy, vâng, bạn nên thực hiện bất kỳ thay đổi nào trong tệp của mình và sau đó thêm và cam kết nó (sử dụng AddCommand và CommitCommand từ API).

+0

Ok, tôi sẽ thử điều này, vì nó có vẻ là cách dễ nhất và có thể tối ưu hóa nó sau này. – Sonson123

3

Bạn có thể muốn xem xét sử dụng Blob's in Git. Kỹ thuật này được sử dụng để lưu trữ khóa PGP công khai khi ký Thẻ. Có vẻ như nội dung bạn vẫn muốn được đưa vào tệp nhưng có thể là tệp tạm thời. Tệp sẽ không tồn tại trong thư mục chính khi ai đó thực hiện thao tác kéo. Nó sẽ là một mục trong cây như một đốm màu.

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

Các -w nói với nó để viết entry cùng với trả lại băm.

git hash-object -w myfile.txt 
6ff87c4664981e4397625791c8ea3bbb5f2279a3 

Cập nhật

tôi đọc lướt qua mục này trên điện thoại của tôi và do đó là ít hơn chu đáo đến từng chi tiết mà bạn cung cấp. Có, bạn cần phải viết chuỗi vào một tập tin, nhưng không có bạn không cần phải thêm nó như một tập tin bình thường. Tôi nghi ngờ rằng JGit có khả năng làm hash-object. Có vẻ như bạn đã có một số mã để xử lý mục nhập BLOB. Có lẽ có một cuộc gọi cấp cao hơn cho đối tượng băm mà bạn không xử lý trực tiếp BLOB.

Xem xét mọi thứ trong Git dựa trên băm nội dung, tôi sẽ nói rằng, ngay cả khi bạn đã tìm cách viết chuỗi trực tiếp bạn không nên. Bạn nên recommit đối tượng có cùng tên tệp như vậy mà bạn nhận được một hash mới và mục cập nhật.

+0

Hm, rất thú vị, cảm ơn. Nhưng tôi sẽ ở lại với Add/CommitCommand bởi vì nó bây giờ là dễ nhất. – Sonson123

3

Vâng, tất nhiên bạn có thể làm những gì bạn muốn, nhưng chỉ cần không sử dụng Add/Cam kết vì họ là một phần của cao cấpPorcelein API mà chỉ là một API tiện xây dựng trên của thấp API cấp. Vì vậy, họ chỉ thực hiện các trường hợp sử dụng phổ biến nhất.

Điều bạn cần làm là xem xét việc triển khai AddCommandCommitCommand để xem cách sử dụng API cấp thấp hơn để tạo đối tượng BLOB và đối tượng cây và đối tượng cam kết.

Tôi muốn đề xuất thứ hai là bạn hoàn toàn read chapter 9 of the Pro Git book để bạn hiểu đúng cách Git hoạt động ở mức thấp.

Các vấn đề liên quan