2010-09-21 28 views
19

Có các định dạng thực sự là các tệp zip trong ngụy trang, ví dụ: docx hoặc odt. Nếu tôi lưu trữ chúng trực tiếp trong điều khiển phiên bản, chúng sẽ được xử lý dưới dạng tệp nhị phân. giải pháp lý tưởng của tôi sẽ làCác tệp đã nén phiên bản (docx, odt)

  • có một cái móc tạo ra một thư mục foo.docx/ cho mỗi foo.docx file trước khi cam kết, giải nén tất cả các file vào nó
  • tùy chọn, có một cái móc mà reindents các file xml
  • có một cái móc tạo lại foo.docx từ các tệp được lưu trữ sau khi cập nhật

Tôi không muốn các tệp docx tự kiểm soát phiên bản. (Tôi biết về một số related question trong đó có cách tiếp cận khác với khuyếch đại tùy chỉnh được đề xuất.)

Điều này có thể thực hiện được không? Đây có phải là doable với mercurial?

CẬP NHẬT:

Tôi biết về móc. Tôi quan tâm đến các chi tiết cụ thể. Đây là một phiên để chứng minh hành vi mong đợi.

> hg add foo.docx 
> hg status 
A foo.docx 
> hg commit 
> # Change foo.docx with external editor 
> hg status 
M foo.docx 
> hg diff 
+++ foo.docx/word/document.xml 
- <w:t>An idea</w:t> 
+ <w:t>A much better idea</w:t> 
+3

'git' có hành vi móc sẽ cho phép điều này, nhưng tôi không biết về hg – Daenyth

+2

Về điểm thứ hai của bạn: Hãy lưu ý rằng các định dạng tài liệu này (đặc biệt là .xslx và ODF) không xử lý khoảng trắng như được chỉ định bởi tiêu chuẩn XML nhưng - chủ yếu cho các mục đích thực tế - bảo toàn khoảng trắng ngay cả khi điều này không được chỉ ra.Do đó, việc sắp xếp lại một tệp có thể thay đổi nội dung. –

+1

Tại sao chính xác bạn không muốn các tập tin định dạng zip đưa vào kiểm soát sửa đổi. Vấn đề bạn muốn giải quyết là gì? – Rudi

Trả lời

5

Nếu bạn có thể vượt qua rào cản của việc giải nén và nén tài liệu Openoffice thành công, thì bạn có thể sử dụng filter system chúng tôi có trong Mercurial. Điều đó cho phép bạn chuyển đổi các tệp trên mọi đọc/ghi từ/đến kho lưu trữ.

Bạn sẽ không may phải làm nhiều việc hơn là giải nén tệp foo.docx. Vấn đề là bạn cần tạo một tệp đơn làm đầu ra - vì vậy có lẽ bạn có thể unzip foo.docx và sau đó tar lên các tệp đã tạo. Sau đó bạn sẽ được phiên bản tarball, mà nên làm việc kể từ khi một tarball chỉ là một concatenations uncompressed của tất cả các tập tin cá nhân với một số thông tin meta. Hãy suy nghĩ về nó, một giải pháp đơn giản hơn là nén tệp foo.docx chưa giải nén lại nhưng chỉ định không nén. Điều đó sẽ cho kết quả tương tự như sử dụng tar.

Giải quyết vấn đề này là điều tôi muốn tự làm, vì vậy hãy báo cáo lại bằng cách gửi thư đến Mercurial mailing list.

+2

Nén không nén dường như hoạt động cả cho odt và đối với tệp docx, cảm ơn mẹo. –

+0

mở rộng zipdoc mở rộng rồi nén không nén và vica-versa. Tôi đang ở đây để tìm hiểu làm thế nào để phân biệt chúng, mặc dù. Tôi nhận được chúng báo cáo như là một nhị phân undiffable. –

3

Bạn có thể sử dụng móc nối trước để giải nén và móc cập nhật để nén. Xem the definite guide về cách sử dụng móc.

Hãy cẩn thận về cách đổi tên. Nếu bạn đổi tên foo.docx thành bar.docx, móc trước của bạn sẽ cần xóa foo.docx/ và thêm bar.docx/.


UPDATE (xin lỗi vì đưa ra một câu trả lời entry-level cho một người dùng 1k-đại diện)

Nếu bạn muốn sử dụng docx giải nén cho các hoạt động hg cốt lõi như diff (status thể làm việc với tập tin đóng gói), bạn phải đi với một phần mở rộng. Tôi nghĩ rằng bạn có thể có cách tiếp cận tương tự như keyword extension để quấn đối tượng repo bằng chính bạn.

Tôi đã viết một số tiện ích mở rộng nhưng không phải ở cấp độ cốt lõi cứng đó, vì vậy tôi không thể cung cấp thêm chi tiết.

Nếu bạn muốn phát điên, bạn thậm chí có thể hợp nhất với tệp chưa được giải nén. Nhưng có lẽ an toàn hơn để coi nó là nhị phân và use external tool để phân biệt và hợp nhất.

+3

Tôi phát hiện ra rằng ít nhất Openoffice là rất cầu kỳ về cách các tập tin được nén. Một chu trình nén zip đơn giản có thể đủ để làm hỏng tệp .od *. – Rudi

+0

@Rudi bạn có thêm thông tin: công cụ zip nào đã được sử dụng không ?, điều gì đã xảy ra ?, v.v. –

13

Tôi đã tự hỏi điều tương tự, và chỉ cần đi qua các mở rộng ZipDoc/lọc cho Mercurial, mà dường như làm chính xác điều này!

Chưa thử, nhưng có vẻ đầy hứa hẹn!

+0

Bạn có cần 'hg rm' và sau đó thêm lại tệp sau khi bạn đã cài đặt tiện ích mở rộng không? Cảm ơn! – NHDaly

+0

@NHDaly Không chắc chắn; Tôi đã không thực sự có được xung quanh để thử nó! Nên dễ dàng, đủ để kiểm tra trong một repo thử nghiệm :-) –

+1

là có một cái gì đó tương tự cho git? – pjz

0

Tôi đã đấu tranh với vấn đề chính xác này trong vài ngày qua và đã viết một tiện ích .NET nhỏ để trích xuất và chuẩn hóa các tệp Excel theo cách dễ dàng hơn để lưu trữ trong điều khiển nguồn. Tôi đã xuất bản thực thi ở đây:

https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe

..và nguồn ở đây:

https://bitbucket.org/htilabs/ooxmlunpack

Nếu có bất cứ quan tâm tôi rất vui khi được làm cho điều này có thể cấu hình hơn, nhưng đồng thời điểm, bạn nên đặt tệp thực thi trong một thư mục (ví dụ: thư mục gốc của kho lưu trữ nguồn của bạn) và khi bạn chạy nó, nó sẽ:

  • Quét các fol der và thư mục con của nó cho bất kỳ .xlsx và các file .xlsm
  • Đi một bản sao của tập tin như * .orig
  • Giải nén mỗi file và tái zip nó không có nén
  • Khá-in bất kỳ tập tin trong kho lưu trữ là hợp lệ XML
  • Xóa tệp calcchain.xml khỏi lưu trữ (vì nó thay đổi rất nhiều và không ảnh hưởng đến nội dung của tệp)
  • Inline bất kỳ giá trị văn bản chưa định dạng nào (nếu không thì chúng được lưu giữ trong bảng tra cứu gây ra những thay đổi lớn trong XML nội bộ nếu ngay cả một ô được sửa đổi)
  • Xóa các giá trị từ bất kỳ tế bào có chứa công thức (kể từ khi họ chỉ có thể được tính khi bảng được tiếp theo mở)
  • Tạo một thư mục con * .extracted, có chứa các nội dung lưu trữ zip chiết xuất

Rõ ràng không phải tất cả những điều này là cần thiết, nhưng kết quả cuối cùng là một tệp bảng tính sẽ vẫn mở trong Excel nhưng có nhiều khả năng hơn để nén khác biệt và gia tăng. Ngoài ra, lưu trữ các tập tin được trích xuất cũng làm cho nó rõ ràng hơn nhiều trong lịch sử phiên bản những thay đổi đã được áp dụng trong mỗi phiên bản.

Nếu có bất kỳ cảm giác thèm ăn nào, tôi rất vui được làm cho công cụ có thể định cấu hình được vì tôi đoán không phải ai cũng muốn nội dung được trích xuất hoặc có thể bị xóa khỏi các ô công thức. khoảnh khắc.

Trong thử nghiệm, bảng tính 2MB 'unpacks' đến 21MB nhưng sau đó tôi có thể lưu trữ năm phiên bản của nó với những thay đổi nhỏ giữa mỗi tệp trong tệp dữ liệu thủy ngân 1.9MB và trực quan hóa sự khác biệt giữa các phiên bản ở chế độ văn bản.

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