2009-06-10 27 views
16

Tôi đã nghe thảo luận về cách các tệp OpenOffice (ODF) nén các tệp zip của XML và các dữ liệu khác. Vì vậy, tạo một thay đổi nhỏ cho tệp có khả năng thay đổi hoàn toàn dữ liệu, do đó nén đồng bộ không hoạt động tốt trong các hệ thống kiểm soát phiên bản.Giải nén các tệp OpenOffice để lưu trữ tốt hơn trong điều khiển phiên bản

Tôi đã thực hiện kiểm tra cơ bản trên một tệp OpenOffice, giải nén và sau đó nén lại bằng nén không. Tôi đã sử dụng tiện ích nén Linux cho thử nghiệm của mình. OpenOffice vẫn vui vẻ mở nó.

Vì vậy, tôi tự hỏi liệu nó có đáng để phát triển một tiện ích nhỏ để chạy trên các tệp ODF mỗi lần ngay trước khi tôi cam kết kiểm soát phiên bản hay không. Bất kỳ suy nghĩ về ý tưởng này? Có thể lựa chọn thay thế tốt hơn?

Thứ hai, cách tốt nhất và mạnh mẽ để triển khai tiện ích nhỏ này là gì? Bash shell gọi zip (chỉ có thể là Linux)? Python? Bất kỳ gotchas bạn có thể nghĩ đến? Rõ ràng là tôi không muốn vô tình mang theo một tập tin, và có một số cách có thể xảy ra.

gotchas Có thể tôi có thể nghĩ:

  • không gian đĩa Thiếu
  • Một số quyền vấn đề khác có thể ngăn chặn bằng văn bản cho tập tin hoặc các tập tin tạm thời
  • tài liệu ODF được mã hóa (có lẽ chỉ nên để lại những một mình; mã hóa cũng có thể gây ra những thay đổi lớn về tập tin và do đó ngăn ngừa nén đồng bằng hiệu quả)

Trả lời

6

Bạn có thể xem xét lưu trữ tài liệu ở định dạng FODT - định dạng XML phẳng.
Đây là giải pháp thay thế tương đối mới có sẵn.

Tài liệu chỉ được lưu trữ được giải nén.

Thông tin khác có sẵn tại https://wiki.documentfoundation.org/Libreoffice_and_subversion.

+0

Sử dụng định dạng * .fodt và * .fods cho tài liệu là cách dễ nhất để giữ các tập tin calcreoffice calc và writer trong điều khiển phiên bản. Không cần cho bất kỳ tiện ích hoặc móc cam kết ưa thích và những lợi ích của việc kiểm soát phiên bản thuần văn bản là tất cả ở đó. – FvD

14

Hệ thống điều khiển phiên bản đầu tiên bạn muốn sử dụng shoul d hỗ trợ móc được gọi để chuyển đổi tập tin từ phiên bản trong kho lưu trữ đến một trong khu vực làm việc, ví dụ như bộ lọc sạch/smudge trong Git từ gitattributes.

Thứ hai, bạn có thể tìm thấy bộ lọc như vậy, thay vì viết một mình, ví dụ rezip từ "Management of opendocument (openoffice.org) files in git" chủ đề trong danh sách git chỉ gửi thư (nhưng thấy cảnh báo trong "Followup: management of OO files - warning about "rezip" approach"),

Bạn cũng có thể duyệt câu trả lời trong chuỗi "Tracking OpenOffice files/other compressed files with Git" hoặc cố gắng tìm câu trả lời bên trong chuỗi "[PATCH 2/2] Add keyword unexpansion support to convert.c".

Hope Đó Giúp

+0

Thông tin tuyệt vời. Tôi quan tâm nhất đến Subversion và Mercurial vào lúc này. Tôi không nghĩ rằng Subversion có tính năng loại sạch/smudge. Không có ý tưởng cho Mercurial - tôi khá mới mẻ với điều đó. –

+0

@Craig: Mercurial có móc. – Borealid

1

Dưới đây là một kịch bản Python mà tôi đã đặt lại với nhau. Nó đã có thử nghiệm tối thiểu cho đến nay. Tôi đã thực hiện thử nghiệm cơ bản trong Python 2.6. Nhưng tôi thích ý tưởng của Python nói chung bởi vì nó nên hủy bỏ với một ngoại lệ nếu có lỗi xảy ra, trong khi một tập lệnh bash có thể không.

Kiểm tra đầu tiên này rằng tệp đầu vào hợp lệ và chưa được giải nén. Sau đó, nó sao chép tệp đầu vào vào tệp "sao lưu" có đuôi ".bak". Sau đó, nó giải nén tập tin gốc, ghi đè nó.

Tôi chắc chắn có những điều tôi đã bỏ qua. Vui lòng phản hồi.


#!/usr/bin/python 
# Note, written for Python 2.6 

import sys 
import shutil 
import zipfile 

# Get a single command-line argument containing filename 
commandlineFileName = sys.argv[1] 

backupFileName = commandlineFileName + ".bak" 
inFileName = backupFileName 
outFileName = commandlineFileName 
checkFilename = commandlineFileName 

# Check input file 
# First, check it is valid (not corrupted) 
checkZipFile = zipfile.ZipFile(checkFilename) 
checkZipFile.testzip() 

# Second, check that it's not already uncompressed 
isCompressed = False 
for fileObject in checkZipFile.infolist(): 
    if fileObject.compress_type != zipfile.ZIP_STORED: 
     isCompressed = True 
if isCompressed == False: 
    raise Exception("File is already uncompressed") 

checkZipFile.close() 

# Copy to "backup" file and use that as the input 
shutil.copy(commandlineFileName, backupFileName) 
inputZipFile = zipfile.ZipFile(inFileName) 

outputZipFile = zipfile.ZipFile(outFileName, "w", zipfile.ZIP_STORED) 

# Copy each input file's data to output, making sure it's uncompressed 
for fileObject in inputZipFile.infolist(): 
    fileData = inputZipFile.read(fileObject) 
    outFileObject = fileObject 
    outFileObject.compress_type = zipfile.ZIP_STORED 
    outputZipFile.writestr(outFileObject, fileData) 

outputZipFile.close() 

Đây là số Mercurial repository in BitBucket.

3

Tôi đã sửa đổi chương trình python trong Craig McQueen's answer chỉ một chút.Các thay đổi bao gồm:

  • Thực sự kiểm tra việc trả về testZip (theo tài liệu, có vẻ như chương trình gốc sẽ tiến hành một tệp zip bị hỏng qua bước kiểm tra).

  • Viết lại vòng lặp để kiểm tra các tệp chưa được nén thành một câu lệnh if.

Dưới đây là chương trình mới:

#!/usr/bin/python 
# Note, written for Python 2.6 

import sys 
import shutil 
import zipfile 

# Get a single command-line argument containing filename 
commandlineFileName = sys.argv[1] 

backupFileName = commandlineFileName + ".bak" 
inFileName = backupFileName 
outFileName = commandlineFileName 
checkFilename = commandlineFileName 

# Check input file 
# First, check it is valid (not corrupted) 
checkZipFile = zipfile.ZipFile(checkFilename) 

if checkZipFile.testzip() is not None: 
    raise Exception("Zip file is corrupted") 

# Second, check that it's not already uncompressed 
if all(f.compress_type==zipfile.ZIP_STORED for f in checkZipFile.infolist()): 
    raise Exception("File is already uncompressed") 

checkZipFile.close() 

# Copy to "backup" file and use that as the input 
shutil.copy(commandlineFileName, backupFileName) 
inputZipFile = zipfile.ZipFile(inFileName) 

outputZipFile = zipfile.ZipFile(outFileName, "w", zipfile.ZIP_STORED) 

# Copy each input file's data to output, making sure it's uncompressed 
for fileObject in inputZipFile.infolist(): 
    fileData = inputZipFile.read(fileObject) 
    outFileObject = fileObject 
    outFileObject.compress_type = zipfile.ZIP_STORED 
    outputZipFile.writestr(outFileObject, fileData) 

outputZipFile.close() 
2

Đây là một chương trình tôi stumbled trên: store_zippies_uncompressed Mirko Friedenhagen.

wiki cũng cho biết cách tích hợp nó với Mercurial.

0

Nếu bạn không cần tiết kiệm bộ nhớ, nhưng chỉ muốn có thể phân biệt các tệp OpenOffice.org được lưu trữ trong hệ thống kiểm soát phiên bản của mình, bạn có thể sử dụng hướng dẫn trên oodiff page. khác với định dạng OpenDocument dưới git và mercurial. (Nó cũng đề cập SVN, nhưng nó được quá lâu kể từ khi tôi sử dụng SVN thường xuyên Tôi không chắc chắn nếu đó là những hướng dẫn hoặc hạn chế.)

(Tôi thấy điều này sử dụng Mirko Friedenhagen's page (trích dẫn bởi Craig McQueen trên))

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