Peut git traiter les fichiers zip comme les répertoires et les fichiers dans le zip comme des gouttes?
Le scénario
Imagine que je suis obligé de travailler avec certains de mes fichiers toujours stockée à l'intérieur de .zip
fichiers. Certains des fichiers dans le zip sont de petits fichiers texte et de changer souvent, tandis que d'autres sont plus grandes, mais heureusement plutôt statique (par exemple, des images).
Si je veux placer ces fichiers zip à l'intérieur d'un git
référentiel, chaque zip est traitée comme une goutte, alors, chaque fois que je commets le référentiel se développe par la taille du fichier zip... même si seulement un petit fichier texte à l'intérieur de changé!
Pourquoi est-ce réaliste
MS Word 2007/2010 .docx
et Excel .xlsx
fichiers sont des fichiers ZIP...
Ce que je veux
Est-il, par hasard, une façon de dire git
à ne traiter que les fichiers zip, mais plutôt comme des répertoires et de traiter le contenu de ces fichiers?
Les avantages
- beaucoup plus petites pensions de taille, c'est à dire plus rapide de transfert/sauvegarde
- Affichage change avec Git à zip serait automagiquement travail
Mais il ne pouvait pas travailler, dites-vous?
Je me rends compte que sans métadonnées supplémentaires cela conduirait à une certaine dose d'ambiguïté: sur un git checkout
git aurait à décider de créer foo.zip/bar.txt
en tant que fichier dans un répertoire ou d'un fichier zip. Cependant cela pourrait être résolu par le biais d'options de configuration, je pense.
Deux idées comment il pourrait être fait (si elle n'existe pas encore)
- à l'aide d'une bibliothèque comme
minizip
ouIO::Compress::Zip
à l'intérieur de git - en quelque sorte l'ajout d'un système de fichiers de couche, tels que git voit réellement les fichiers zip comme des répertoires de commencer avec
- Le scénario avec
.docx
fichiers de sens, mais dans de nombreux autres cas, vous pourriez envisager de suivi les fichiers individuels normalement avec git et seul bâtiment le résultant.zip
utilisant un outil de construction commemake
. - Considérant que les deux fichiers zip qui semblent différents les uns des autres peut contenir exactement les mêmes données (par exemple un fichier texte zippé à deux reprises avec deux différents niveaux de compression), cela devient beaucoup plus compliqué. Alors qu'il est facile de représenter la diff entre les deux versions des fichiers décompressés avec peu d'informations, je suppose que représente la diff entre les deux versions de l'archive (qui est essentiellement ce que git a à faire) avec aussi peu d'informations serait non négligeable.
- Avez-vous jamais jusqu'à la fin avec une solution mise en œuvre de Jeff réponse ou tout autre chose? Je me demandais fondamentalement les mêmes, sauf pour les archives tar, ce qui devrait générer un compatible de réponse...
- SAP de l'Outil de Conception d'Information (IDT) crée un fichier similaire à la structure de son
UNX
format. Il est également récursive: il contient unBLX
fichier et unDFX
de fichier, qui sont à la fois des archives, qui correspondent à l'est "couche" et "de la fondation de données', respectivement. J'aimerais avoir une solution. - Jetbrains construire-dans le VCS ne vous permettent de regarder à l'intérieur de zip les fichiers de type. Très utile, mais vous oblige à examiner par exemple, PRs à l'intérieur de l'IDE. Maintenant que Microsoft a pris le dessus, on peut voir cela dans le github pr diff ainsi.
Vous devez vous connecter pour publier un commentaire.
Ce qui n'existe pas, mais il pourrait facilement existent dans le cadre actuel. Tout comme git agit différemment avec l'affichage binaire ou ascii des fichiers lors de l'exécution d'un diff, il pourrait être dit d'offrir un traitement spécial à certains types de fichiers grâce à l'interface de configuration.
Si vous ne souhaitez pas modifier le code de base (même si c'est une bonne idée que vous avez), vous pouvez également le script vous-même en utilisant pre-commit et post-extraction des crochets pour décompresser et de stocker les fichiers, puis de les renvoyer à leurs .zip de l'état à la caisse. Vous devez restreindre les actions uniquement les fichiers de gouttes /index spécifié par
git add
.Est un peu de travail, c'est juste une question de savoir si les autres git félicite sont au courant de ce qui se passe et jouer bien.
Ne sais pas si quelqu'un est toujours intéressé à cette question. Je suis confronté au même problème et voici ma solution qui utilise git filtre de fichiers.
Edit:
Tout d'abord, je ne peut pas l'état de clair, mais ce EST une réponse à la discussion de la question! Lire l'ensemble de la phrase avant de commenter. En outre, grâce à @Toon Krijthe pour le conseil pour clarifier la solution en place.
Ma solution est d'utiliser un filtre "à plat" le fichier zip dans un monolithique élargi (peut être énorme) fichier texte. Lors de la commande git add/commettre le fichier zip sera automatiquement étendu à ce format de texte normal texte de comparaison, et lors de la commande, il est automatiquement fermée à nouveau.
Le fichier texte est composé d'enregistrements, chacun représente un fichier dans le zip. De sorte que vous pouvez chose de ce fichier texte est un texte basé sur l'image pour l'original zip. Si le fichier dans le zip est un texte dans l'acte, il est copié dans le fichier texte; sinon, il est encodé en base64 avant copiés dans le fichier de format texte. Cela permet de maintenir le fichier texte toujours d'un fichier texte.
Bien que ce filtre ne permet pas de faire de chaque fichier dans le zip un blob, un fichier texte sont mappés une ligne à l'autre, qui est l'unité de la diff, tandis que les fichiers binaires, des modifications peuvent être représentés par des mises à jour de leur correspondant en base64, je pense que c'est équivalent à ce que l'OP imagine.
Pour plus de détails et un prototypage de code que vous pouvez lire sur le lien suivant:
Zippey Git filtre de fichier
Aussi, de crédit à l'endroit que m'a inspiré le sujet de cette solution:
Description de la façon dont le fichier de filtre fonctionne
LICENSE
fichier ou quelque chose d'équivalent dans le référentiel. Pas de licence = tous droits réservés.Utilisation bup (présentées en détail dans GitMinutes #24)
C'est la seule git-comme système conçu pour faire face à de gros (même très très grand) de fichiers, ce qui signifie que chaque version d'un fichier zip ne fera qu'augmenter le repo de son delta (au lieu d'une pleine copie supplémentaire)
Le résultat est un repo git, à intervalles réguliers, commande Git peut lire.
J'en détail comment
bup
diffère de Git dans "git avec de gros fichiers".De toute autre solution de contournement (comme
git-annex
) n'est pas entièrement satisfaisante, comme détaillé dans "git-annex
avec de gros fichiers".http://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/
(Note: par commentaire de Ruben, ce n'est que sur l'obtention d'un bon diff cependant, ne pas commettre fichiers décompressés.)
git diff
ing. J'ai utilisé[diff "gzip"] = zcat
et*.gz diff=gzip
.Je pense que vous allez avoir besoin de monter un fichier zip pour le système de fichiers. Je ne l'ai pas utilisé, mais envisager de FUSIBLE:
http://code.google.com/p/fuse-zip/
Il est également ZFS pour Windows et Linux:
http://users.telenet.be/tfautre/softdev/zfs/
git
, droit? Dommage que je ne suis pas toujours sous Linux avec qui repo, sinon fusible-zip serait vraiment une bonne idée.Il y a souvent des problèmes avec les pré-fichiers zippés pour des applications comme ils attendent la méthode de compression zip et le fichier afin d'être celui qu'ils ont choisi. Je crois que open office .odf fichiers ont ce problème.
Cela dit, si vous êtes tout simplement à l'aide de tout-vieux-zip comme une méthode pour garder les choses ensemble que vous devez être en mesure de créer un peu simple d'alias qui permettra de décompresser et de re-zip lorsque requis. La toute dernière Msysgit (alias Git pour Windows) a maintenant deux zip et décompressez-le sur la coque du code côté de sorte que vous pouvez les utiliser dans des alias.
Le projet que je suis en train de travailler sur les utilisations zips que le local principal de contrôle de version /archive, donc je suis aussi en train d'essayer d'obtenir un résultat convenable de définir des alias pour l'aspiration de ces centaines de zips dans le dépôt git (et de les faire sortir de nouveau ; -), de sorte que les collaborateurs sont heureux.
deflate
avec différentes longueurs de mot,deflate64
et modification d'un fichier de commande dans le fichier zip produite par 7zip tous ne jetez pas de Mot off). À propos de l'utilisation d'alias, j'ai été en espérant pour éviter toute surcharge de l'étape manuelle... actuellement, la plupart de mes commet passer par TortoiseGit.Rezip, semblable à Zippey par sippey, permet de manipuler les fichiers ZIP dans une jolie manière avec git.
Comment il fonctionne
Lors de l'ajout/commettre un ZIP fichier, Rezip dévoile et qu'elle conditionne sans compression, avant de l'ajouter à l'index/commit. Dans un décompressé le fichier ZIP,
les fichiers archivés apparaissent est-à - dans son contenu (en collaboration avec quelques binary meta-info avant chaque fichier). Si ces fichiers archivés sont des fichiers de texte brut, cette méthode jouent bien avec git.
Avantages
Le principal avantage de Rezip sur Zippey, c'est que le fichier est stocké dans le référentiel est toujours un fichier ZIP. Ainsi, dans de nombreux cas, il faudra encore travailler est-à - avec l'application correspondante (par exemple Open Office), même si elle est obtenue sans l'intermédiaire d'un ré-emballage-avec-filtre de compression.
Comment utiliser
Installer le filtre(s) sur votre système:
Utiliser le filtre dans votre référentiel, en ajoutant des lignes comme celles-ci à votre
<repo-root>/.gitattributes
fichier:La
textual
partie est de sorte que ces fichiers sont en fait montré que les fichiers texte dans les diffs.