Cara melakukan kontrol versi dokumen yang lebih baik pada file Excel dan file skema SQL

99

Saya bertanggung jawab atas beberapa file Excel dan file skema SQL. Bagaimana saya harus melakukan kontrol versi dokumen yang lebih baik pada file-file ini?

Saya perlu mengetahui bagian yang dimodifikasi (bagian yang berbeda) dalam file ini dan menyimpan semua versi untuk referensi. Saat ini saya menambahkan stempel waktu pada nama file, tetapi saya merasa sepertinya tidak efisien.

Adakah cara atau praktik yang baik untuk melakukan kontrol versi dokumen yang lebih baik?

Omong-omong, editor mengirimi saya file melalui email.

Marcus Thornton
sumber
5
Saya dapat mengonversi file Excel ini menjadi file CSV, dan kemudian melacaknya menggunakan git sehingga saya dapat menggunakan diff untuk melihat modifikasinya. Apakah ada praktik baik lainnya?
Marcus Thornton
Lihat jawaban lainnya, yang menurut saya lebih baik dari yang Anda terima.
nealmcb

Jawaban:

45

Karena Anda telah menandai pertanyaan Anda dengan Saya berasumsi bahwa Anda bertanya tentang penggunaan Git untuk ini.

Nah, SQL dump adalah file teks biasa sehingga sangat masuk akal untuk melacaknya dengan Git. Buat saja repositori dan simpan di dalamnya. Ketika Anda mendapatkan versi baru dari sebuah file, cukup timpa dan komit, Git akan mencari tahu semuanya untuk Anda, dan Anda akan dapat melihat tanggal modifikasi, memeriksa versi tertentu dari file ini dan membandingkan versi yang berbeda.

Hal yang sama berlaku .xlsxjika Anda mendekompresi mereka. .xlsxfile adalah zip direktori file XML (Lihat Cara merakit file xlsx yang valid dengan benar dari sub-komponen internalnya? ). Git akan melihatnya sebagai biner kecuali didekompresi. Anda dapat mengekstrak .xlsxdan melacak perubahan pada file XML individu di dalam arsip.

Anda juga dapat melakukan ini dengan .xlsfile, tetapi masalahnya di sini adalah .xlsformatnya biner, jadi Anda tidak bisa mendapatkan perbedaan yang berarti darinya. Tetapi Anda masih dapat melihat riwayat modifikasi dan memeriksa versi tertentu.

kirelagin
sumber
4
Ya, saya tahu git. Saya pikir git bagus saat melacak skema SQL. Sedangkan untuk file Excel (.xlsx dan .xls), karena mereka adalah file biner, melacaknya menggunakan git tidak dapat menunjukkan kepada saya apa yang telah diubah dalam perspektif manusia. Ini yang membuatku bingung.
Marcus Thornton
2
@ MarcusThornton .xlsxadalah XML, jadi seharusnya berfungsi dengan baik. Secara umum, tidak ada cara mudah untuk membandingkan dua .xlsfile. Anda mungkin bisa menambahkan hook pra-komit yang akan diletakkan di .csvdekatnya dan Anda akan bisa membedakannya.
kirelagin
86

Jawaban yang saya tulis di sini dapat diterapkan dalam kasus ini. Alat yang disebut xls2txt dapat memberikan keluaran yang dapat dibaca manusia dari file .xls. Jadi singkatnya, Anda harus meletakkan ini ke file .gitattributes Anda:

*.xls diff=xls

Dan di .git / config:

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

Tentu saja, saya yakin Anda juga dapat menemukan alat serupa untuk jenis file lain, membuat git diffalat yang sangat berguna untuk dokumen perkantoran. Inilah yang saat ini saya miliki di .gitconfig global saya:

[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

Buku Pro Git memiliki bab yang bagus tentang topik ini: 8.2 Menyesuaikan Atribut Git - Git

1615903
sumber
2
itu tidak berhasil untuk saya di windows7. Saya telah mengunduh versi catdoc untuk Windows dari sini: blog.brush.co.nz/2009/09/catdoc-windows daripada mengedit gitconfig dan atribut seperti dijelaskan di atas. tetapi saya masih mendapatkan: diff --git a / src / Reports / src / main / etc / templates / nbcu.xls b / src / Reports / src / main / etc / templates / nbcu.xls index 2476319..1daec86 100644 Biner file a / src /.../ test.xls dan b / src /.../ test.xls berbeda versi GIT: 1.7.6.msysgit.1
katrin
Apakah masih menyimpan dokumen sebagai file doc atau sebagai file teks? Jika itu adalah file teks, bagaimana Anda memulihkan dokumen tersebut?
CMCDragonkai
@CMCDragonkai Ini tidak berpengaruh pada bagaimana file disimpan, hanya output dari perintah diff yang terpengaruh.
1615903
1
Jadi itu masih menyimpan seluruh file, bukan perbedaannya?
CMCDragonkai
3
Re: xls2txt: sangat enggan memasang alat sumber tertutup dari situs web Polandia. Ini mungkin hal yang sama? github.com/hroptatyr/xls2txt Tidak ada README meskipun ...
jcollum
22

Saya telah berjuang dengan masalah yang tepat ini selama beberapa hari terakhir dan telah menulis utilitas .NET kecil untuk mengekstrak dan menormalkan file Excel sedemikian rupa sehingga lebih mudah untuk disimpan di kontrol sumber. Saya telah menerbitkan eksekusi di sini:

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

..dan sumbernya di sini:

https://bitbucket.org/htilabs/ooxmlunpack

Jika ada minat, saya senang membuatnya lebih dapat dikonfigurasi, tetapi saat ini, Anda harus meletakkan file yang dapat dieksekusi di folder (misalnya root repositori sumber Anda) dan ketika Anda menjalankannya, itu akan:

  • Pindai folder dan subfoldernya untuk menemukan file .xlsx dan .xlsm
  • Ambil salinan file sebagai * .orig.
  • Unzip setiap file dan zip ulang tanpa kompresi.
  • Cukup cetak file apa pun dalam arsip yang merupakan XML yang valid.
  • Hapus file calcchain.xml dari arsip (karena banyak berubah dan tidak memengaruhi konten file).
  • Sebariskan nilai teks apa pun yang tidak diformat (jika tidak, ini disimpan dalam tabel pencarian yang menyebabkan perubahan besar dalam XML internal bahkan jika satu sel dimodifikasi).
  • Hapus nilai dari sel mana pun yang berisi rumus (karena mereka hanya bisa dihitung saat lembar dibuka berikutnya).
  • Buat subfolder * .extracted, yang berisi konten arsip zip yang diekstrak.

Jelas tidak semua hal ini diperlukan, tetapi hasil akhirnya adalah file spreadsheet yang akan tetap terbuka di Excel, tetapi lebih dapat menerima kompresi diffing dan incremental. Selain itu, menyimpan file yang diekstrak juga membuatnya lebih jelas dalam riwayat versi perubahan apa yang telah diterapkan di setiap versi.

Jika ada selera makan di luar sana, saya senang membuat alat ini lebih dapat dikonfigurasi karena saya kira tidak semua orang ingin konten diekstraksi, atau mungkin nilai dihapus dari sel formula, tetapi keduanya sangat berguna bagi saya saat ini.

Dalam pengujian, spreadsheet 2 MB 'membongkar' menjadi 21 MB, tetapi kemudian saya dapat menyimpan lima versi dengan perubahan kecil di antara masing-masing, dalam file data Mercurial 1,9 MB, dan memvisualisasikan perbedaan antara versi secara efektif menggunakan Beyond Compare di mode teks.

NB: meskipun saya menggunakan Mercurial, saya membaca pertanyaan ini saat meneliti solusi saya dan tidak ada solusi khusus Mercurial tentang solusi tersebut, yang seharusnya berfungsi dengan baik untuk Git atau VCS lainnya.

Jon G
sumber
Saya sebenarnya belum mencoba, tetapi saya berasumsi akan - jika Anda mencobanya, akan sangat menyenangkan untuk mengetahuinya
Jon G
@JonG Saya tidak bisa membuatnya berfungsi dengan LibreOffice dan tidak ada tab Masalah di repositori bitbucket. Saya ingin berkontribusi jika kita bisa mendapatkan masalah!
Christian Droulers
Hai @ christian-droulers, saya telah mengaktifkan masalah di Repo, jangan ragu untuk menambahkan sesuatu di sana!
Jon G
@JonG Ini tampak hebat, memiliki riwayat versi yang dapat difabel bisa sangat berguna dalam banyak skenario terkait dokumen! Tetapi mengapa penting agar file dibuka di Excel? Tidak bisakah Anda menggunakan file .orig saja? Dan menurut Anda apakah normalisasi dapat dikonfigurasi / dinamis sehingga kode tersebut dapat digunakan untuk docx / pptx juga?
Jørgen Tvedt
10

Tante merekomendasikan pendekatan yang sangat sederhana dalam Mengelola format file berbasis ZIP di Git :

Buka file ~ / .gitconfig Anda (buat jika belum ada) dan tambahkan bait berikut:

[diff "zip"]
textconv = unzip -c -a
Roberto Cabellon
sumber
3
kemudian, Peng Xu memperluas solusinya, memungkinkan untuk membuat versi file berbasis zip menggunakan filter, selain hanya melihat perubahan diff: tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/ …
Roberto Cabellon
4

Gunakan ekstensi dokumen terbuka .fods. Ini adalah format markup XML biasa dan tidak terkompresi yang dapat dibuka oleh Excel dan LibreOffice, dan perbedaannya akan terlihat bagus.

thouliha
sumber
2

Kami telah membuat ekstensi baris perintah Git open-source untuk buku kerja Excel: https://www.xltrail.com/git-xltrail .

Singkatnya, fitur utamanya adalah membuatnya git diffberfungsi pada format file buku kerja apa pun sehingga memperlihatkan perbedaan pada konten VBA buku kerja (pada titik tertentu, kami akan membuat ini berfungsi untuk konten lembar kerja, juga).

Ini masih awal tapi mungkin bisa membantu.

Bjoern Stiel
sumber
dan lebih dari dua tahun kemudian masih hanya menangani VBA, sementara banyak solusi lain menangani keseluruhan spreadsheet. Saya belum benar-benar peduli tentang konten VBA dari spreadsheet selama lebih dari satu dekade (atau lebih tepatnya, saya secara aktif mencoba untuk menghindari ...).
Auspex
1

Seperti yang disebutkan dalam komentar jawaban lain, file .xlsx hanyalah XML.

Untuk masuk ke direktori XML (yang git-able), Anda harus "mengekstrak" file .xlsx ke direktori. Cara cepat untuk melihat ini di Windows adalah dengan mengganti nama file <filename> .xlsx menjadi <filename> .zip, dan Anda akan melihat konten di dalamnya. Saya akan menyimpan ini bersama dengan biner sehingga ketika Anda checkout, Anda tidak perlu melakukan langkah lain untuk membuka dokumen di Excel.

g19fanatic
sumber
1
Setidaknya alat zip yang saya gunakan (7-zip) memungkinkan untuk membuka / mengekstrak semua file - Anda tidak perlu mengganti namanya.
Onur
1

Utilitas Excel ini bekerja sangat baik untuk saya:

Kontrol Versi untuk Excel

Ini adalah alat pembuatan versi yang cukup mudah untuk buku kerja dan makro VBA. Setelah Anda memasukkan sebuah versi, versi tersebut disimpan ke repositori Git di PC Anda. Saya tidak pernah mencobanya kembali. File skema SQL, tapi saya yakin ada jalan lain.

eriklind
sumber
Ini adalah satu-satunya alat yang saya temukan yang berfungsi dengan modul yang disematkan dalam file .xlsm. Satu-satunya alternatif yang saya tahu adalah menjalankan makro untuk mengekspor setiap modul ke filenya sendiri, mengkomitnya, dan kemudian menjalankan makro untuk mengimpor semuanya lagi setelah menarik dan menggabungkan. xltrailjauh lebih mudah dari itu.
Michael Hoffmann
0

Pendekatan saya dengan file Excel mirip dengan Jon, tetapi alih-alih bekerja dengan data teks Excel mentah, saya mengekspor ke format yang lebih ramah.

Ini alat yang saya gunakan: https://github.com/stenci/ExcelToGit/tree/master

Yang Anda butuhkan hanyalah mengunduh file .xlsm (klik tautan Lihat Mentah di halaman ini .) Jangan lupa untuk memeriksa pengaturan Excel seperti yang dijelaskan di readme. Anda juga dapat menambahkan kode untuk mengekspor data SQL ke file teks.

Buku kerja ini adalah konverter dari biner Excel ke file teks dan peluncur alat Windows Git, dan dapat digunakan juga dengan proyek yang tidak berhubungan dengan Excel.

Versi kerja saya dikonfigurasi dengan lusinan buku kerja Excel. Saya menggunakan file tersebut juga untuk membuka Git-gui untuk proyek non Excel, hanya menambahkan folder git dengan tangan.

stenci
sumber