32 votes

Mettre à jour une équipe de développement avec l'historique de repo Git réécrit, en supprimant les gros fichiers

J'ai un repo git avec de très gros fichiers binaires en elle. Je n'ai plus besoin d'eux, et je ne se soucient pas de pouvoir extraire les fichiers à partir plus tôt s'engage. Donc, afin de réduire les pensions de taille, je veux supprimer les fichiers binaires à partir de l'histoire".

Après une recherche sur le web, j'en ai conclu que ma meilleure (seule?) l'option est d'utiliser git-filter-branch:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD

Cela vous semble comme une bonne approche jusqu'à présent?

En supposant que la réponse est oui, j'ai un autre problème à résoudre. Le git manuel a cet avertissement:

AVERTISSEMENT! Le réécrit l'histoire aura différents noms d'objets pour tous les objets et converge pas avec l'origine de la branche. Vous ne serez pas en mesure de pousser facilement et distribuer la version remaniée de la branche sur le dessus de l'origine de la branche. S'il vous plaît ne pas utiliser cette commande si vous ne connaissez pas toutes les implications, et éviter de l'utiliser de toute façon, si une simple et unique commettre suffirait pour résoudre votre problème. (Voir la "RÉCUPÉRATION DE l'AMONT REBASE" section git-git rebase(1) pour de plus amples informations à propos de la réécriture publié l'histoire.)

Nous avons une distance de pensions de titres sur notre serveur. Chaque développeur pousse et tire d'elle. Basé sur l'avertissement ci-dessus (et ma compréhension de la façon dont git-filter-branch des travaux), je ne pense pas que je vais être en mesure d'exécuter git-filter-branch sur ma copie locale et de pousser ensuite les modifications.

Donc, je suis provisoirement de la planification à passer par les étapes suivantes:

  1. Dis à tous mes développeurs de commit, push, et arrêter de travailler un peu.
  2. Connectez-vous au serveur et d'exécuter le filtre sur le repo central.
  3. Demandez à chacun de supprimer leurs copies anciennes et clone à partir du serveur.

Est-ce à son droit? Est-ce la meilleure solution?

18voto

cdhowie Points 62253

Oui, votre solution fonctionne. Vous avez également une autre option: au lieu de faire cela sur le repo central, exécutez le filtre sur votre clone et puis repoussez avec git push --force --all. Cela va forcer le serveur à accepter les nouvelles branches à partir de votre référentiel. Cela remplace l'étape 2 seulement; les autres étapes seront les mêmes.

Si vos développeurs sont assez Git-savvy, alors ils ne peuvent pas supprimer leurs copies anciennes; par exemple, ils pourraient aller chercher les nouvelles télécommandes et rebase leur sujet branches appropriées.

9voto

Roberto Tyley Points 4352

Votre plan est bon (bien qu'il serait préférable d'effectuer le filtrage sur un simple clone de votre référentiel, plutôt que sur le serveur central), mais de préférence à l' git-filter-branch vous devez utiliser ma BFG Repo-Nettoyant, une plus rapide, alternative plus simple à git-filter-branch spécialement conçu pour éliminer les gros fichiers à partir de Git repos.

Télécharger le jar Java (nécessite Java 6 ou au-dessus) et exécutez cette commande:

$ java -jar bfg.jar  --strip-blobs-bigger-than 1MB  my-repo.git

Toute goutte de plus de 1 mo (qui n'est pas dans votre dernier commit) seront totalement supprimés à partir de votre référentiel de l'histoire. Vous pouvez ensuite utiliser git gc pour nettoyer la mort des données:

$ git gc --prune=now --aggressive

Le BFG est en général de 10-50x plus rapide que la course git-filter-branch , et les options sont sur mesure autour de ces deux cas d'utilisation:

  • Retrait Fou De Gros Fichiers
  • La suppression des mots de passe, Identifiants et autres données Privées

5voto

Ben Jackson Points 28358

Si vous ne faites pas re-cloner vos développeurs, il est probable qu'ils parviendront à faire glisser les gros fichiers. Par exemple, s'ils se joignent soigneusement à la nouvelle histoire, vous allez créer et arriver à git merge à partir d'une branche de projet locale qui n'a pas été rebasée, les parents de la validation de fusion incluront la branche de projet qui pointe finalement sur l'historique complet que vous avez effacé avec git filter-branch .

3voto

Jason Axelson Points 587

Votre solution n'est pas complète. Vous devez inclure --tag-name-filter cat comme un argument de filtre de direction de sorte que les balises qui contiennent les fichiers de grande taille sont également modifiés. Vous devez également modifier toutes les références au lieu de juste la TÊTE depuis que la livraison ne pouvait être en de multiples branches.

Voici un code de meilleure qualité:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' --tag-name-filter cat -- --all

Github est un bon guide: https://help.github.com/articles/remove-sensitive-data

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