2011-07-17 6 views
3

Nous avons un certain fichier binaire dans notre dépôt git. Habituellement, sa taille est d'environ 2 Mo. Un de nos développeurs a accidentellement validé ce fichier avec toutes ses dépendances, ce qui a fait grimper le fichier à environ 40Mo.Nettoyage des blobs binaires dans un dépôt git

Bien sûr, nous avons commis une version corrigée, mais le dépôt principal a toujours ce bloc inutile de 40 Mo de données binaires dont nous n'avons pas besoin. Je peux garantir que nous n'aurons jamais besoin de l'historique de ce fichier pour cette validation spécifique (ou pour tout autre commit d'ailleurs - c'est un binaire compilé, nous avons quand même la version versionnée). Comment puis-je supprimer ce blob de données pour restaurer la taille de la pension?

Un simple git gc ne suffit pas, et je pense que j'ai besoin d'un piratage de niveau inférieur que je ne connais pas.

+0

Oui. De toute évidence, l'espace disque dont nous nous soucions moins. Mais ce repo doit être déployé sur des serveurs distants. Nous ne pouvons pas avoir ces frais généraux de 40 Mo. –

+0

@Yuval, vous déployez toujours tout le repo? Pourquoi? Ne serait-il pas mieux si vous déployiez simplement la version actuelle ou si vous utilisiez 'git pull' pour déployer seulement les changements (cela signifierait de transférer ces 40 Mo * une fois *)? – svick

+0

Même ainsi, cela est utile de savoir - et gardera la taille globale du repo vers le bas si cela est fait religieusement. 40 Mo ici, 40 Mo là, ajoutera facilement à quelques Go. – Arafangion

Répondre

5

Si vous pouvez créer le fichier à partir du code source, il n'appartient probablement pas au référentiel.

Si vous souhaitez supprimer cette version du fichier du référentiel, vous devez le rebaser, idéalement en utilisant git rebase -i. Le problème avec cela est qu'il réécrit l'historique et que vous ne devriez pas le faire pour les validations qui sont déjà publiques (c'est-à-dire partagées entre plusieurs utilisateurs). Voir Recovering from upstream rebase pour savoir comment faire ce travail si vous le voulez vraiment. Après avoir fait ce rebasage, le fichier restera dans le référentiel pendant un certain temps, mais il sera supprimé automatiquement par la suite. Et il ne sera pas transmis du tout, si vous utilisez git clone ou git pull.

+0

Je pense que l'autre réponse (avec ses commentaires) laisse assez floue que cela nécessite une réécriture de l'histoire. Vous devez le faire comme si vous n'aviez jamais commis cette version du fichier en premier lieu. (Je suis en train de déterminer si le fichier devrait être mis de côté.) – Cascabel

0

Si vous passez à la caisse, le fichier arrivera dans votre copie locale du dépôt. alors utilisez git rm pour le sortir. Ou, pour donner l'impression qu'il n'a jamais été ajouté: Completely remove file from all Git repository commit history

+0

Impossible de faire, ce fichier ne peut pas être retiré du repo –

+0

Yuval: Vous voulez soit l'enlever du repo - ou vous ne voulez pas. CHOISIR! – Arafangion

+0

(Incidemment, vous pouvez vérifier une copie précédente à la place.) – Arafangion

Questions connexes