Một Ngày Bị Darcs "Hành Hạ"
Dạo này mình muốn thử nghiệm Darcs thay cho SVN truyền thống trong một dự án con. Chỉ là thử nghiệm thôi nhé! Trước giờ toàn dùng Darcs ở môi trường local nên ít gặp trục trặc. Hôm nay quyết định setup kho lưu trữ tập trung trên một máy FreeBSD. Ai ngờ gặp phải loạt vấn đề rắc rối không tưởng!
Ý tưởng ban đầu rất đơn giản: Tạo một tài khoản chuyên dụng trên máy chủ kho lưu trữ, thêm public key của các thành viên vào, mọi người có thể truy cập qua SSH để thực hiện các thao tác get/put/pull/push một cách thuận tiện. Trên hệ FreeBSD hay Linux thì mọi chuyện đều ổn, nhưng đến Windows thì lại vấp phải sự cố kỳ lạ.
Vấn đề nằm ở phía Windows: Phiên bản Darcs cho Windows cứ gặp phải patch bundle lớn là báo lỗi khi commit. Mất nguyên một ngày trời mới tìm ra nguyên nhân. Ban đầu nghi ngờ do phiên bản Darcs không đồng nhất - FreeBSD dùng 2.0.2 còn Windows lại là 2.0.0. Mỗi lần lỗi lại thấy dòng thông báo quen thuộc:
|
|
Cứ tưởng do định dạng patch bundle bị lỗi. Thử chuyển sang định dạng kho lưu trữ cũ cũng không ăn thua. Google tìm kiếm thì thấy nhiều người gặp lỗi tương tự nhưng không có lời giải. Cố gắng tìm bản Darcs 2.0.2 đã build sẵn cho Windows không được, tự build trên Windows cũng bó tay. Đành quay về build bản 2.0.0 trên FreeBSD nhưng vẫn không giải quyết được vấn đề.
Khi dùng lệnh darcs send -O
để tạo patch file, sau đó scp lên máy chủ rồi ssh vào apply thì lại thành công. Chứng tỏ không phải do tương thích phiên bản. Mình còn tạo một file .bat để theo dõi cách Darcs gọi ssh thông qua biến DARCS_SSH
. Phát hiện ra khi push, thực chất là đang chạy darcs apply
trên máy chủ và chờ dữ liệu từ stdin. Vì các patch nhỏ vẫn chạy ngon, chỉ có patch lớn mới lỗi, nên nghi ngờ vấn đề nằm ở Windows console. Thử thay đổi các thiết lập console, test đi test lại thấy cùng một patch bundle có lúc thành công lúc thất bại. Rõ ràng là dữ liệu truyền qua pipe qua ssh bị mất mát.
Cuối cùng đành từ bỏ phiên bản Darcs build bằng MingW và công cụ plink.exe (của PuTTY) đi kèm. Chuyển sang cài đặt Cygwin với OpenSSH thì mọi chuyện mới ổn. Thú vị là nếu dùng Cygwin kết hợp với PuTTY’s ssh thì vẫn lỗi. Mình nghi ngờ nguyên nhân chính nằm ở công cụ ssh.exe được đóng gói trong bản Darcs cho Windows (thực chất là plink.exe của PuTTY) hoặc do cơ chế pipe trên Windows quá tệ hại.
Ôi trời, chạy các công cụ dòng lệnh kiểu *nix trên Windows đúng là cực hình! Ghi lại mớ bòng bong này mong giúp được ai đó cũng đang vật lộn với Darcs trên Windows. Nhân tiện quảng bá chút: Dù bị hành một trận tơi bời, Darcs vẫn là công cụ tuyệt vời. Nếu bạn từng dùng SVN/CVS sẽ rất dễ chuyển sang. Dưới đây là bảng so sánh lệnh cơ bản:
|
|
Khác biệt lớn nhất với SVN là Darcs không dùng số phiên bản, tư duy làm việc hoàn toàn khác biệt nhưng lại rất tự nhiên và trực quan. Mời các bạn yêu thích hệ thống kiểm soát phiên bản trải nghiệm thử!