Como realizar um melhor controle de versão de documento em arquivos Excel e arquivos de esquema SQL

98

Sou responsável por vários arquivos Excel e arquivos de esquema SQL. Como devo realizar um melhor controle de versão do documento nesses arquivos?

Preciso saber a parte modificada (parte diferente) nesses arquivos e manter todas as versões para referência. No momento, estou acrescentando a data e hora ao nome do arquivo, mas achei que parecia ineficiente.

Existe uma maneira ou boa prática de melhorar o controle de versão do documento?

A propósito, os editores me enviam os arquivos por e-mail.

Marcus Thornton
fonte
5
Posso converter esses arquivos do Excel em arquivos CSV e, em seguida, rastreá-los usando o git para poder usar o diff para ver a modificação. Existe alguma outra boa prática?
Marcus Thornton
Veja as outras respostas, que acho melhores do que a que você aceitou.
nealmcb

Respostas:

45

Já que você marcou sua pergunta com Presumo que você esteja perguntando sobre o uso do Git para isso.

Bem, os dumps SQL são arquivos de texto normais, então faz todo o sentido rastreá-los com o Git. Basta criar um repositório e armazená-los nele. Quando você obtém uma nova versão de um arquivo, simplesmente sobrescreve e confirma, o Git descobrirá tudo para você e você será capaz de ver as datas de modificação, verificar versões específicas deste arquivo e comparar diferentes versões.

O mesmo é verdade .xlsxse você os descompactar. .xlsxos arquivos são diretórios compactados de arquivos XML (consulte Como montar corretamente um arquivo xlsx válido a partir de seus subcomponentes internos? ). O Git os verá como binários, a menos que sejam descompactados. É possível descompactar .xlsxe rastrear as alterações nos arquivos XML individuais dentro do arquivo.

Você também pode fazer isso com .xlsarquivos, mas o problema aqui é que o .xlsformato é binário, então você não pode obter diferenças significativas a partir dele. Mas você ainda será capaz de ver o histórico de modificações e ver as versões específicas.

Kirelagin
fonte
4
Sim, eu sei git. Eu acho que o git é bom para rastrear esquemas SQL. Quanto aos arquivos Excel (.xlsx e .xls), por serem arquivos binários, rastreá-los usando o git não pode me mostrar o que foi modificado na perspectiva humana. É isso que estou confundindo.
Marcus Thornton
2
@MarcusThornton .xlsxé XML, então deve funcionar bem. Em geral, não há como comparar facilmente dois .xlsarquivos. Você provavelmente poderia adicionar um gancho de pré-confirmação que colocará um .csvpróximo a ele e você será capaz de diferenciá-los.
Kirelagin
86

A resposta que escrevi aqui pode ser aplicada neste caso. Uma ferramenta chamada xls2txt pode fornecer saída legível por humanos de arquivos .xls. Resumindo, você deve colocar isso em seu arquivo .gitattributes:

*.xls diff=xls

E no .git / config:

[diff "xls"]
    binary = true
    textconv = /path/to/xls2txt

Claro, tenho certeza que você também pode encontrar ferramentas semelhantes para outros tipos de arquivo, tornando-se git diffuma ferramenta muito útil para documentos de escritório. Isso é o que eu tenho atualmente em meu .gitconfig global:

[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

O livro Pro Git tem um bom capítulo sobre o assunto: 8.2 Customizando Git - Atributos Git

1615903
fonte
2
não funciona para mim no windows7. Baixei a versão catdoc para Windows aqui: blog.brush.co.nz/2009/09/catdoc-windows e edite gitconfig e atributos conforme descrito acima. mas ainda consigo: diff --git a / src / Reports / src / main / etc / templates / nbcu.xls b / src / Reports / src / main / etc / templates / nbcu.xls índice 2476319..1daec86 100644 Binário os arquivos a / src /.../ test.xls eb / src /.../ test.xls diferem da versão GIT: 1.7.6.msysgit.1
katrin
Ele ainda está armazenando o documento como um arquivo doc ou como um arquivo de texto? Se for um arquivo de texto, como você recupera o documento?
CMCDragonkai
@CMCDragonkai Isso não tem efeito sobre como o arquivo é armazenado, apenas a saída do comando diff é afetada.
1615903
1
Portanto, ele ainda está armazenando o arquivo inteiro, não os diffs?
CMCDragonkai
3
Re: xls2txt: extremamente relutante em instalar uma ferramenta de código fechado de um site polonês. Isso pode ser a mesma coisa? github.com/hroptatyr/xls2txt No entanto, sem README ...
jcollum
22

Tenho lutado com esse problema exato nos últimos dias e escrevi um pequeno utilitário .NET para extrair e normalizar arquivos do Excel de forma que eles sejam muito mais fáceis de armazenar no controle de origem. Publiquei o executável aqui:

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

..e a ​​fonte aqui:

https://bitbucket.org/htilabs/ooxmlunpack

Se houver algum interesse, fico feliz em tornar isso mais configurável, mas no momento, você deve colocar o executável em uma pasta (por exemplo, a raiz do seu repositório de origem) e quando você executá-lo, ele irá:

  • Examine a pasta e suas subpastas em busca de arquivos .xlsx e .xlsm
  • Faça uma cópia do arquivo como * .orig.
  • Descompacte cada arquivo e volte a compactá-lo sem compactação.
  • Faça uma impressão bonita de todos os arquivos no arquivo que sejam XML válidos.
  • Exclua o arquivo calcchain.xml do arquivo (uma vez que muda muito e não afeta o conteúdo do arquivo).
  • Inline quaisquer valores de texto não formatados (caso contrário, eles são mantidos em uma tabela de pesquisa que causa grandes mudanças no XML interno se até mesmo uma única célula for modificada).
  • Exclua os valores de quaisquer células que contenham fórmulas (uma vez que eles podem ser calculados apenas quando a planilha for aberta novamente).
  • Crie uma subpasta * .extraído, contendo o conteúdo do arquivo zip extraído.

É claro que nem todas essas coisas são necessárias, mas o resultado final é um arquivo de planilha que ainda será aberto no Excel, mas que é muito mais fácil de difundir e compactar incrementalmente. Além disso, armazenar os arquivos extraídos também torna muito mais óbvio no histórico da versão quais mudanças foram aplicadas em cada versão.

Se houver algum apetite, fico feliz em tornar a ferramenta mais configurável, pois acho que nem todo mundo vai querer que o conteúdo seja extraído, ou possivelmente os valores removidos das células da fórmula, mas ambos são muito úteis para mim no momento.

Nos testes, uma planilha de 2 MB 'descompacta' até 21 MB, mas então fui capaz de armazenar cinco versões dela com pequenas alterações entre cada uma, em um arquivo de dados Mercurial de 1,9 MB, e visualizar as diferenças entre as versões efetivamente usando Beyond Compare em modo de texto.

NB: embora eu esteja usando o Mercurial, li esta questão enquanto pesquisava minha solução e não há nada específico do Mercurial sobre a solução, deve funcionar bem para Git ou qualquer outro VCS.

Jon G
fonte
Na verdade, não tentei, mas presumo que - se você tentar, seria ótimo saber
Jon G
@JonG Não consigo fazer funcionar com o LibreOffice e não há guia Problemas no repositório bitbucket. Adoraria contribuir se pudéssemos resolver um problema!
Christian Droulers,
Olá @ christian-droulers, Habilitei o problema no Repo. Fique à vontade para adicionar algo lá!
Jon G
@JonG Isso parece ótimo, ter um histórico de versão difícil pode ser realmente útil em muitos cenários relacionados a documentos! Mas por que é importante que o arquivo seja aberto no Excel? Você não pode simplesmente usar o arquivo .orig? E você acha que as normalizações podem ser configuráveis ​​/ dinâmicas para que o código possa ser usado para docx / pptx também?
Jørgen Tvedt
10

Tante recomendou uma abordagem muito simples no gerenciamento de formatos de arquivo baseados em ZIP no Git :

Abra seu arquivo ~ / .gitconfig (crie se ainda não houver) e adicione a seguinte estrofe:

[diff "zip"]
textconv = unzip -c -a
Roberto Cabellon
fonte
3
então, o Peng Xu estendeu a solução, permitindo o versionamento de arquivos baseados em zip usando filtro, além de visualizar apenas as alterações de diff: tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/ …
Roberto Cabellon
4

Use a extensão de documento aberto .fods. É um formato de marcação XML simples e não compactado que tanto o Excel quanto o LibreOffice podem abrir e as diferenças terão uma boa aparência.

Thouliha
fonte
2

Construímos uma extensão de linha de comando Git de código aberto para pastas de trabalho do Excel: https://www.xltrail.com/git-xltrail .

Em suma, a principal característica é que torna git diff funciona em qualquer formato de arquivo de pasta de trabalho, de modo que mostra a diferença no conteúdo VBA da pasta de trabalho (em algum momento, faremos isso funcionar para o conteúdo das planilhas também).

Ainda é cedo, mas pode ajudar.

Bjoern Stiel
fonte
e mais de dois anos depois, ele ainda lida com VBA, enquanto muitas das outras soluções lidam com a planilha inteira. Na verdade, não me importei com o conteúdo VBA de uma planilha em mais de uma década (ou mais corretamente, tentei ativamente evitar que ...).
Auspex
1

Conforme mencionado no comentário de outra resposta, os arquivos .xlsx são apenas XML.

Para chegar ao diretório XML (que é git-able), você deve "descompactar" o arquivo .xlsx para um diretório. Uma maneira rápida de ver isso no Windows é renomear o arquivo <filename> .xlsx para <filename> .zip, e você verá o conteúdo interno. Eu armazenaria isso junto com o binário para que, ao finalizar a compra, não precisasse realizar outras etapas para abrir o documento no Excel.

g19fanatic
fonte
1
Pelo menos a ferramenta zip que uso (7-zip) permite abrir / extrair todos os arquivos - você não precisa renomeá-los.
Onur
1

Este utilitário do Excel funciona muito bem para mim:

Controle de versão para Excel

É uma ferramenta de controle de versão bastante simples para pastas de trabalho e macros VBA. Depois de confirmar uma versão, ela é salva em um repositório Git no seu PC. Eu nunca tentei isso. Arquivos de esquema SQL, mas tenho certeza de que há uma maneira de contornar.

eriklind
fonte
Esta é a única ferramenta que descobri que funciona com módulos incorporados em arquivos .xlsm. A única alternativa que conheço é executar uma macro para exportar cada módulo para seu próprio arquivo, confirmá-los e, em seguida, executar uma macro para importá-los novamente após extrair e mesclar. xltrailé muito mais fácil do que isso.
Michael Hoffmann
0

Minha abordagem com arquivos do Excel é semelhante à de Jon, mas em vez de trabalhar com os dados de texto brutos do Excel, eu exporto para formatos mais amigáveis.

Aqui está a ferramenta que utilizo: https://github.com/stenci/ExcelToGit/tree/master

Tudo que você precisa é baixar o arquivo .xlsm (clique no link Visualizar Raw nesta página ). Não se esqueça de verificar a configuração do Excel conforme descrito no leiame. Você também pode adicionar o código para exportar dados SQL para arquivos de texto.

A pasta de trabalho é um conversor de arquivos binários do Excel para arquivos de texto e um iniciador das ferramentas do Windows Git, e pode ser usado também com projetos não relacionados ao Excel.

Minha versão de trabalho está configurada com dezenas de pastas de trabalho do Excel. Eu uso o arquivo também para abrir o Git-gui para projetos não Excel, apenas adicionando a pasta git manualmente.

stenci
fonte