10 điểm bởi levish 2025-09-05 | 2 bình luận | Chia sẻ qua WhatsApp

Xin chào 🙂

Tôi từng gặp tình huống trong một dự án cần thực hiện 3-way merge cho các thay đổi chuỗi, và tôi cần một thư viện có thể hoạt động như git merge-file nhưng cho phép gộp chuỗi trực tiếp trong bộ nhớ.

Tôi đã xem qua các thư viện hiện có, nhưng:

  • hoặc bắt buộc phải dùng tệp tạm
  • hoặc không xử lý xung đột theo đúng cách như Git
  • hoặc thường không hỗ trợ chiến lược gộp mà tôi mong muốn.

Vì vậy cuối cùng tôi đã viết Rust binding cho xdiff của libgit2 (mã C, giống hệt phần nội bộ của Git).

use threeway_merge::{merge_strings, MergeOptions};  
  
let result = merge_strings(base, ours, theirs, &MergeOptions::default())?;  

Tính năng:

  • Hỗ trợ mọi thuật toán gộp của Git (Myers, Patience, Histogram, v.v.)
  • Hỗ trợ kiểu xung đột (normal, diff3, zdiff3)
  • Có thể tự động ưu tiên một phía, hoặc kết hợp các thay đổi bằng chiến lược union
  • Hoạt động giống 100% với các bài kiểm thử git merge-file

Liên kết:

Tôi chia sẻ ở đây vì nghĩ rằng có thể cũng sẽ hữu ích với những người khác!

2 bình luận

 
jamiecha 2025-09-06

Dự án thật tuyệt! Mã nguồn gọn gàng nên có vẻ sẽ là một ví dụ rất hay để tích hợp qua FFI.
Nhưng khi tôi chạy cargo test thì bị lỗi, không biết có phải vì tôi đang dùng Ubuntu trên WSL2 không nhỉ?

=== COMPREHENSIVE TEST RESULTS ===
Scenarios tested: 12
Total test combinations: 576
Passing tests: 96
Failing tests: 480
Success rate: 16.7%

 
levish 2025-09-06

Tôi nhớ là các tham số của git mà script kiểm thử dùng trên WSL đã khác nhau.