Как улучшить контроль версий документов в файлах 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 работает очень хорошо для меня:

Контроль версий для Excel

Это довольно простой инструмент управления версиями для рабочих книг и макросов VBA. Как только вы фиксируете версию, она сохраняется в Git-репозитории на вашем ПК. Я никогда не пробовал это повторно. Файлы схемы SQL, но я уверен, что есть способ обойти.

Мы создали расширение командной строки Git с открытым исходным кодом для книг Excel: https://www.xltrail.com/git-xltrail.

Короче говоря, главная особенность в том, что он делает git diff работать с любыми форматами файлов рабочей книги, чтобы она отображала разницу в содержимом VBA рабочей книги (в какой-то момент мы сделаем эту работу и для содержимого рабочих таблиц).

Еще рано, но это может помочь.

Как уже упоминалось в комментарии другого ответа, файлы.xlsx - это просто XML.

Чтобы попасть в каталог XML (который git-able), вы должны "разархивировать" файл.xlsx в каталог. Быстрый способ увидеть это в Windows - переименовать файл .xlsx в .zip, и вы увидите внутреннее содержимое. Я бы сохранил это вместе с двоичным файлом, чтобы при оформлении заказа вам не приходилось делать другие шаги, чтобы открыть документ в Excel.

Мой подход к файлам 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
Другие вопросы по тегам