11 votes

git : conserver uniquement la dernière version d'un fichier spécifique

J'en garde quelques-uns Notes de cours LaTex sur github. Mes collègues ne savent pas utiliser LaTex et m'ont demandé de mettre le PDF final dans le repo.

Conserver des résultats de compilation binaires dans un repo est généralement une mauvaise idée, et télécharger le fichier PDF en tant que fichier externe après chaque poussée n'est pas pratique.

Existe-t-il un moyen de ne conserver que la dernière version du PDF dans la base de données ?

4voto

user17812119 Points 31

J'avais exactement la même question. Quelques années ont passé, et je pense que les réponses existantes ne sont plus tout à fait optimales. Si j'ai bien compris, les téléchargements sur github ne sont plus une fonctionnalité gratuite -- vous ne bénéficiez de cette fonctionnalité que si vous payez pour votre compte github.

Bien que la réponse de Sergiu Dumitriu soit correcte en soulignant les inconvénients de la réécriture de l'historique dans git, l'OP et moi-même travaillons sur des projets solo, et pour un tel projet, ce n'est pas si important de réécrire l'historique.

Une solution qui semble fonctionner assez bien pour moi à partir de 2022 est la suivante. Je crée une page web Github Pages pour mon projet, dans un sous-répertoire docs/. Lorsque je compile mon fichier latex en pdf, mon makefile copie le pdf dans ce répertoire. Le fichier pdf est sous contrôle de version. Au fil du temps, les différences binaires de ce fichier pdf augmentent massivement la taille de mon arborescence de répertoires. Cependant, je peux utiliser git filter-repo (un outil tiers) pour supprimer le fichier de l'historique de mon projet. Ensuite, mon fichier makefile script copie la dernière version du fichier dans le sous-répertoire docs/. Voici à quoi ressemble la partie concernée de mon fichier makefile :

forget_pdf_history:
    test -e $(BOOK).pdf || exit 1
    git commit --allow-empty -a -m "updating before erasing history of docs/$(BOOK).pdf"
    git filter-repo --path docs/$(BOOK).pdf --invert-paths
    make reconfigure_git
    cp $(BOOK).pdf docs
    git add docs/$(BOOK).pdf
    git push --force -u origin master

reconfigure_git:
    git remote add origin https://github.com/bcrowell/ransom.git
    git config remote.origin.url git@github.com:bcrowell/ransom.git

Il est vrai que c'est assez laid de devoir reconstruire la configuration de git, mais cela fonctionne, et cela me permet d'avoir un site web raisonnable pour le livre sans utiliser d'autres ressources que github.

3voto

chelmertz Points 8774

Si vous êtes déjà sur github, il y a un panneau appelé "Downloads" où vous pouvez ajouter n'importe quel fichier que vous avez. Il y a probablement un appel API pour cela si vous voulez l'ajouter à un hook pour quand vous poussez. Vous pouvez également construire + copier le pdf sur votre compte dropbox/rsync dans un dossier commun/utiliser une autre API share-my-files/

Vous feriez mieux de générer le pdf et de le leur envoyer par e-mail, également déclenché par un crochet.

Si vous finissez par construire, ajouter le pdf au repo et ensuite mettre à jour ce fichier souvent, le repo va devenir très grand car les diffs qu'il devra conserver prendront beaucoup d'espace inutilement.

3voto

Sergiu Dumitriu Points 5959

Il n'existe pas de moyen simple et efficace de supprimer les anciennes versions d'un fichier d'un dépôt. Chaque livraison est sécurisée, ce qui signifie que l'identifiant d'une livraison est construit en utilisant, entre autres, le contenu de chaque fichier. Il existe des moyens de réécrire l'histoire d'un dépôt git, mais cette façon de faire annule toute possibilité de collaboration, puisque vous créez en fait un nouveau dépôt à chaque fois que vous réécrivez l'historique.

Une autre solution consiste à utiliser l'option annexe git qui a été conçu spécialement pour cet objectif : gérer des fichiers volumineux dans un petit référentiel. Malheureusement, il s'agit d'une fonctionnalité assez nouvelle, et elle ne fait pas partie du Git officiel, donc le support n'est pas aussi bon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X