2010-09-21 79 views
19

Il existe des formats qui sont en réalité des fichiers zip déguisés, par ex. docx ou odt. Si je les stocke directement dans le contrôle de version, ils sont traités comme des fichiers binaires. Ma solution idéale seraitFichiers zippés contrôlant la version (docx, odt)

  • un crochet qui crée un répertoire foo.docx/ pour chaque foo.docx fichiers engagent avant, décompressez tous les fichiers dans ce
  • le cas échéant, un crochet qui réindentera les fichiers xml
  • ont un crochet recréant foo.docx des fichiers stockés après la mise à jour

Je ne veux pas les docx fichiers eux-mêmes être sous contrôle de version. (J'ai connaissance d'un related question où une approche différente avec un diff personnalisé a été suggérée.)

Est-ce faisable? Est-ce faisable avec mercurial?

MISE À JOUR:

Je sais à propos de crochets. Je suis intéressé par les détails. Voici une session pour démontrer le comportement attendu.

> hg add foo.docx 
> hg status 
A foo.docx 
> hg commit 
> # Change foo.docx with external editor 
> hg status 
M foo.docx 
> hg diff 
+++ foo.docx/word/document.xml 
- <w:t>An idea</w:t> 
+ <w:t>A much better idea</w:t> 
+3

'git' a le comportement de crochet qui permettra ceci, mais je ne sais pas à propos de hg – Daenyth

+2

Concernant votre deuxième point: Sachez que ces formats de document (en particulier .xslx et ODF) ne traitent pas les espaces comme spécifié par la norme XML, mais - principalement à des fins pratiques - conserve les espaces même si cela n'est pas indiqué.Par conséquent, réindigner un fichier peut changer le contenu. –

+1

Pourquoi ne voulez-vous pas que les fichiers au format zip soient contrôlés? Quel est le problème que vous voulez résoudre? – Rudi

Répondre

5

Si vous pouvez franchir l'obstacle de décompresser et de compresser avec succès les documents Openoffice, alors vous devriez pouvoir utiliser le filter system que nous avons dans Mercurial. Cela vous permet de transformer des fichiers à chaque lecture/écriture depuis/vers le référentiel.

Vous devrez malheureusement faire plus que simplement décompresser le fichier foo.docx. Le problème est que vous devez générer un seul fichier en sortie - donc peut-être vous pouvez unzip foo.docx puis tar les fichiers générés. Vous serez alors versionner l'archive, ce qui devrait fonctionner car une archive n'est qu'une concaténation non compressée de tous les fichiers individuels avec des méta-informations. En y réfléchissant, une solution plus simple serait de compresser à nouveau le fichier foo.docx décompressé mais de ne spécifier aucune compression. Cela devrait donner des résultats similaires à l'utilisation de tar.

Résoudre ce problème est quelque chose que je voulais faire moi-même, alors s'il vous plaît signaler en envoyant un mail à Mercurial mailing list.

+2

Le zipping sans compression semble fonctionner à la fois pour odt, et pour les fichiers docx, merci pour le conseil. –

+0

zipdoc extension dézippe puis zips sans compression, et vice-versa. Je suis ici pour savoir comment les différencier, cependant. Je les fais signaler comme un binaire indiffrable. –

3

Vous pouvez utiliser un hook précommit pour décompresser et un hook de mise à jour pour le zip. Voir the definite guide sur l'utilisation des crochets.

Faites attention à renommer. Si vous renommez foo.docx en bar.docx, votre crochet précommit devra supprimer foo.docx/ et ajouter bar.docx/.


UPDATE (désolé pour donner une réponse au niveau d'entrée à un utilisateur 1k-rep)

Si vous souhaitez utiliser docx déballées principales opérations hg comme diff (status peut fonctionner avec fichier compressé), vous devriez aller avec une extension. Je pense que vous pouvez prendre une approche similaire à la keyword extension pour envelopper l'objet de dépôt avec le vôtre.

J'ai écrit certaines extensions mais pas à ce niveau de base, donc je ne peux pas fournir plus de détails.

Si vous voulez devenir fou, vous pouvez même fusionner avec un fichier déballé. Mais il est probablement plus sûr de le traiter comme binaire et use external tool à diff et fusionner.

+3

J'ai découvert qu'au moins Openoffice est très pointilleux sur la façon dont les fichiers sont compressés. Un simple cycle de décompression peut suffire à corrompre un fichier .od *. – Rudi

+0

@Rudi avez-vous plus d'informations: quel outil zip a été utilisé, que s'est-il passé ?, etc. –

13

Je me demandais la même chose, et juste rencontré l'extension ZipDoc/filtre pour Mercurial, qui semble faire exactement cela!

N'a pas encore essayé, mais il semble prometteur!

+0

Avez-vous besoin de 'hg rm', puis rajoutez le fichier après avoir installé l'extension? Merci! – NHDaly

+0

@NHDaly Pas sûr; Je n'ai pas vraiment essayé de l'essayer! Devrait être assez facile à tester dans un rapport de test :-) –

+1

Y at-il quelque chose de similaire pour git? – pjz

0

J'ai été aux prises avec ce problème exact ces derniers jours et j'ai écrit un petit utilitaire .NET pour extraire et normaliser les fichiers Excel de telle sorte qu'ils soient beaucoup plus faciles à stocker dans le contrôle des sources. J'ai publié l'exécutable ici:

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

..et la source ici:

https://bitbucket.org/htilabs/ooxmlunpack

S'il y a un intérêt que je suis heureux de rendre plus configurable, mais au moment, vous devriez mettre l'exécutable dans un dossier (par exemple la racine de votre référentiel source) et quand vous l'exécutez, il le fera:

  • Scannez le fol der et ses sous-dossiers pour tout .xlsx et les fichiers .xlsm
  • Prenez une copie du fichier comme * .orig
  • Décompressez chaque fichier et re-zip avec aucune compression
  • Pretty-impression des fichiers dans l'archive qui sont XML valide
  • Supprimez le fichier calcchain.xml de l'archive (car il change beaucoup et ne modifie pas le contenu du fichier)
  • Inline toutes les valeurs de texte non formaté (sinon ceux-ci sont conservés dans une table de consultation ce qui provoque de gros changements dans le code XML interne si une seule cellule est modifiée)
  • Supprimer les valeurs de les cellules qui contiennent des formules (car ils peuvent simplement être calculés lorsque la feuille est ensuite ouverte)
  • Créer un sous-dossier * .extracted, contenant le contenu de l'archive zip extraits

Il est clair que pas toutes ces choses sont nécessaires, mais le résultat final est un fichier tableur qui s'ouvre toujours dans Excel mais qui est beaucoup plus facile à différer et la compression incrémentielle. De plus, le stockage des fichiers extraits rend beaucoup plus évident dans l'historique des versions les modifications qui ont été appliquées dans chaque version. S'il y a un appétit là-dedans, je suis heureux de rendre l'outil plus configurable car je suppose que tout le monde ne voudra pas extraire le contenu, ou peut-être les valeurs retirées des cellules de formule, mais elles sont toutes deux très utiles. le moment. Dans les tests, une feuille de calcul de 2 Mo 'décompresse' à 21 Mo, mais j'ai pu en stocker cinq versions avec de petits changements entre les deux, dans un fichier de données de 1.9MB, et visualiser les différences entre les versions. en mode texte.