Как улучшить контроль версий документов в файлах Excel и файлах схемы SQL
Я отвечаю за несколько файлов Excel и файлов схемы SQL. Как мне лучше контролировать версию документа в этих файлах?
Мне нужно знать, какая часть изменена (другая часть) в этих файлах и сохранить все версии для справки. В настоящее время я добавляю отметку времени к имени файла, но я обнаружил, что она кажется неэффективной.
Есть ли способ или хорошая практика для лучшего контроля версий документа?
Кстати, редакторы присылают мне файлы по электронной почте.
10 ответов
Поскольку вы пометили свой вопрос с помощью git, я предполагаю, что вы спрашиваете об использовании Git для этого.
Что ж, дампы SQL - это обычные текстовые файлы, поэтому имеет смысл отслеживать их с помощью Git. Просто создайте хранилище и сохраните их в нем. Когда вы получаете новую версию файла, просто перезаписываете его и фиксируете, Git выяснит все за вас, и вы сможете увидеть даты изменения, проверить конкретные версии этого файла и сравнить разные версии.
То же самое верно для .xlsx
если вы распакуете их. .xlsx
файлы - это заархивированные каталоги файлов XML (см. Как правильно собрать действительный файл xlsx из его внутренних подкомпонентов?). Git будет рассматривать их как двоичные файлы, если они не распакованы. Можно распаковать .xlsx
и отслеживать изменения в отдельных файлах XML внутри архива.
Вы также можете сделать это с .xls
файлы, но проблема здесь в том, что .xls
Формат двоичный, поэтому вы не можете получить значимые различия. Но вы все равно сможете увидеть историю изменений и проверить конкретные версии.
Ответ, который я здесь написал, может быть применен в этом случае. Инструмент под названием xls2txt может обеспечить читабельный вывод из файлов.xls. Короче говоря, вы должны поместить это в ваш файл.gitattributes:
*.xls diff=xls
И в.git / config:
[diff "xls"]
binary = true
textconv = /path/to/xls2txt
Конечно, я уверен, что вы можете найти аналогичные инструменты для других типов файлов, что делает git diff
очень полезный инструмент для офисных документов. Это то, что у меня есть в моем глобальном.gitconfig:
[diff "xls"]
binary = true
textconv = /usr/bin/py_xls2txt
[diff "pdf"]
binary = true
textconv = /usr/bin/pdf2txt
[diff "doc"]
binary = true
textconv = /usr/bin/catdoc
[diff "docx"]
binary = true
textconv = /usr/bin/docx2txt
В книге Pro Git есть хорошая глава на эту тему: 8.2 Настройка Git - атрибутов Git
В последние несколько дней я боролся с этой проблемой и написал небольшую утилиту.NET для извлечения и нормализации файлов Excel таким образом, чтобы их было намного проще хранить в системе контроля версий. Я опубликовал исполняемый файл здесь:
https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe
..И источник здесь:
https://bitbucket.org/htilabs/ooxmlunpack
Если есть какой-то интерес, я рад сделать это более настраиваемым, но на данный момент вы должны поместить исполняемый файл в папку (например, в корень вашего исходного репозитория), и когда вы запустите его, он будет:
- Сканирование папки и ее подпапок для любых файлов.xlsx и.xlsm
- Возьмите копию файла как *.orig.
- Разархивируйте каждый файл и повторно заархивируйте его без сжатия.
- Pretty-распечатать любые файлы в архиве, которые являются действительными XML.
- Удалите файл calcchain.xml из архива (так как он сильно меняется и не влияет на содержимое файла).
- Вставьте любые неформатированные текстовые значения (в противном случае они хранятся в справочной таблице, которая вызывает большие изменения во внутреннем XML-файле, если хотя бы одна ячейка модифицирована).
- Удалите значения из любых ячеек, которые содержат формулы (поскольку их можно просто рассчитать при следующем открытии листа).
- Создайте подпапку *.extracted, содержащую извлеченное содержимое архива zip.
Очевидно, что не все эти вещи необходимы, но конечным результатом является файл электронной таблицы, который все равно будет открыт в Excel, но который гораздо более поддается диффузии и инкрементальному сжатию. Кроме того, сохранение извлеченных файлов также делает более очевидным в истории версий, какие изменения были применены в каждой версии.
Если есть какой-то аппетит, я с радостью сделаю инструмент более настраиваемым, так как, полагаю, не все захотят извлечь содержимое или, возможно, значения, удаленные из ячеек формулы, но сейчас они оба очень полезны для меня.
В тестах электронная таблица размером 2 МБ "распаковывалась" до 21 МБ, но затем мне удалось сохранить пять ее версий с небольшими изменениями между ними в файле данных Mercurial объемом 1,9 МБ и эффективно визуализировать различия между версиями, используя Beyond Compare в текстовый режим.
NB: хотя я использую Mercurial, я читаю этот вопрос во время исследования своего решения, и в нем нет ничего специфичного для Mercurial, оно должно хорошо работать для Git или любой другой VCS.
Tante сделал это очень простым в управлении форматами файлов на основе ZIP в Git:
Откройте файл ~/.gitconfig (создайте, если он еще не создан) и добавьте следующий раздел:
[diff "zip"]
textconv = unzip -c -a
Используйте расширение открытого документа .fods
, Это простой, несжатый формат разметки XML, который могут открывать как Excel, так и LibreOffice, и различия будут выглядеть хорошо.
Эта утилита Excel работает очень хорошо для меня:
Это довольно простой инструмент управления версиями для рабочих книг и макросов VBA. Как только вы фиксируете версию, она сохраняется в Git-репозитории на вашем ПК. Я никогда не пробовал это повторно. Файлы схемы SQL, но я уверен, что есть способ обойти.
Мы создали расширение командной строки Git с открытым исходным кодом для книг Excel: https://www.xltrail.com/git-xltrail.
Короче говоря, главная особенность в том, что он делает git diff
работать с любыми форматами файлов рабочей книги, чтобы она отображала разницу в содержимом VBA рабочей книги (в какой-то момент мы сделаем эту работу и для содержимого рабочих таблиц).
Еще рано, но это может помочь.
Как уже упоминалось в комментарии другого ответа, файлы.xlsx - это просто XML.
Чтобы попасть в каталог XML (который git
-able), вы должны "разархивировать" файл.xlsx в каталог. Быстрый способ увидеть это в Windows - переименовать файл
Мой подход к файлам Excel аналогичен подходу Джона, но вместо работы с необработанными текстовыми данными Excel я экспортирую в более удобные форматы.
Вот инструмент, который я использую: https://github.com/stenci/ExcelToGit/tree/master
Все, что вам нужно, это загрузить файл.xlsm (нажмите ссылку "Просмотреть сырье" на этой странице.) Не забудьте проверить настройки Excel, как описано в файле readme. Вы также можете добавить код для экспорта данных SQL в текстовые файлы.
Рабочая книга является конвертером из двоичного Excel в текстовые файлы и средством запуска инструментов Git для Windows, а также может использоваться с проектами, не относящимися к Excel.
Моя рабочая версия настроена с десятками книг Excel. Я также использую этот файл, чтобы открыть Git-gui для проектов, отличных от Excel, просто добавив папку git вручную.
Если вы не хотите загружать сторонние конвертеры в свой проект, другой вариант — написать собственный скрипт для конвертации файла Excel за вас. Я добавил свой собственный конвертер с помощью Python. Скрипт на питоне:
from pandas import DataFrame, read_excel
from argparse import ArgumentParser
from os import remove
def change_file_format_to_csv(filename):
filename = filename.split(".")
filename[-1] = 'csv'
if __name__ == "__main__":
# Parse arguments
parser = ArgumentParser()
parser.add_argument("-i", "--input", default="", required=False,
help="Input file to be converted")
args = parser.parse_args()
# Load input
print(args.input)
content = read_excel(args.input)
# Change filename to csv
filename_output = args.input.split(".")
filename_output[-1] = "csv"
filename_output = '.'.join(filename_output)
# Store input as CSV
content.to_csv(filename_output)
# Cat output to command line
with open(filename_output, 'r') as f:
print(f.read())
# Remove temporary file
remove(filename_output)
Затем вы добавляете (как объяснено в других ответах) имя скрипта python в ваши файлы .git/config и .gitattributes.
.gitатрибуты:
*.xls diff=xls
.git/конфиг:
[diff "xlsx"]
textconv = python ./utils/xlsx_to_csv.py --input