我听说过关于OpenOffice(ODF)文件是如何压缩XML和其他数据的zip文件的讨论。因此,对文件进行微小更改可能会完全改变数据,因此增量压缩在版本控制系统中无法正常工作。
我已经对OpenOffice文件进行了基本测试,解压缩然后以零压缩方式重新压缩它。我使用Linux zip实用程序进行测试。 OpenOffice仍然乐意打开它。
所以我想知道每次在我提交版本控制之前是否值得开发一个小实用程序来运行ODF文件。对这个想法的任何想法?可能更好的替代方案?
其次,实现这个小实用程序的好方法是什么?调用zip的Bash shell(可能只是Linux)?蟒蛇?你能想到的任何陷阱?显然我不想意外地破坏文件,并且有几种方法可能发生。
我能想到的可能的问题:
答案 0 :(得分:14)
首先,您要使用的版本控制系统应该支持调用钩子,这些钩子被调用以将文件从存储库中的版本转换为工作区域中的版本,例如来自gitattributes的Git中的清除/涂抹过滤器。
其次,你可以找到这样的过滤器,而不是自己编写一个,例如 rezip 来自git邮件列表上的“Management of opendocument (openoffice.org) files in git”主题(但请参阅“{{3}中的警告}),
您还可以在“Followup: management of OO files - warning about "rezip" approach”主题中浏览答案,或尝试在“Tracking OpenOffice files/other compressed files with Git”主题中找到答案。
希望有助于
答案 1 :(得分:6)
您可以考虑以FODT格式存储文档 - 平面XML格式 这是一种相对较新的替代解决方案。
文档只是解压缩存储。
https://wiki.documentfoundation.org/Libreoffice_and_subversion提供了更多信息。
答案 2 :(得分:3)
我在Craig McQueen's answer中修改了python程序。变更包括:
实际上检查testZip的返回(根据文档,原来的程序似乎很乐意通过checkzip步骤继续使用损坏的zip文件)。
重写for循环以检查已经解压缩的文件是否为单个if语句。
以下是新计划:
#!/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()
答案 3 :(得分:2)
这是我偶然发现的另一个节目:Mirko Friedenhagen的store_zippies_uncompressed。
wiki还展示了如何将其与Mercurial集成。
答案 4 :(得分:1)
这是我编写的Python脚本。到目前为止,它的测试次数很少。我已经在Python 2.6中完成了基本测试。但我更喜欢Python的概念,因为如果发生任何错误,它应该中止异常,而bash脚本可能不会。
首先检查输入文件是否有效且尚未解压缩。然后将输入文件复制到扩展名为“.bak”的“备份”文件。然后它解压缩原始文件,覆盖它。
我确信有些东西我忽略了。请随时提供反馈。
#!/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()
答案 5 :(得分:0)
如果您不需要节省存储空间,但只是希望能够对存储在版本控制系统中的OpenOffice.org文件进行区分,则可以使用oodiff page上的说明,该说明说明了如何制作oodiff在git和mercurial下的OpenDocument格式的默认差异。 (它也提到了SVN,但是我经常使用SVN已经很久了,我不确定这些是指示还是限制。)
(我发现这是使用Mirko Friedenhagen's page(上面Craig McQueen引用))