J'ai bien peur de ne rien trouver de tel que ce scénario particulier.
J'ai un référentiel git avec beaucoup d'histoire: 500+ branches, 500+ balises, remontant à la mi-2007. Il contient environ 19 500 commits. Nous aimerions supprimer tout l'historique avant le 1er janvier 2010, pour le rendre plus petit et plus facile à gérer (nous conserverions une copie complète de l'historique dans un référentiel d'archives).
Je connais le commit que je veux être devenu la racine du nouveau dépôt. Je ne peux cependant pas trouver le bon git mojo pour tronquer le dépôt pour commencer avec ce commit. Je devine une variante de
git filter-branch
impliquant des greffes serait nécessaire; il pourrait également être nécessaire de traiter chacune des branches 200+ que nous voulons garder séparément puis patcher de nouveau le repo ensemble (quelque chose que je ne sais comment faire).
Quelqu'un a-t-il déjà fait quelque chose comme ça? J'ai git 1.7.2.3 si cela compte.
la source
git filter-branch --tag-name-filter cat -- --all
pour mettre à jour les balises. Mais j'ai également des balises plus anciennes pointant vers l'ancienne histoire que je veux supprimer. Comment puis-je me débarrasser de toutes ces anciennes balises? Si je ne les supprime pas, l'historique plus ancien ne disparaît pas et je peux toujours le voir avecgitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Il est peut-être trop tard pour publier une réponse, mais comme cette page est le premier résultat de Google, elle peut toujours être utile.
Si vous voulez libérer de l'espace dans votre dépôt git, mais ne voulez pas reconstruire tous vos commits (rebase ou greffe), tout en étant capable de pousser / tirer / fusionner à partir de personnes qui ont le dépôt complet, vous pouvez utiliser le git cloner un clone peu profond ( paramètre --depth ).
Vous pouvez peut-être réduire votre référentiel existant en suivant ces étapes:
Comment supprimer toutes les balises locales git?
Ps: les anciennes versions de git ne prenaient pas en charge le clonage / push / pull de / vers des dépôts superficiels.
la source
cd
accéder à un dossier qui vient d'être supprimé? J'ai l'impression qu'il manque des informations ici. Existe-t-il également un moyen d'appliquer ces modifications au référentiel distant?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
Fonctionne comme un charme!git filter-branch -- --all
. Cela va changer tous les hachages mais après cela, vous pourrez le pousser vers un nouveauCette méthode est facile à comprendre et fonctionne bien. L'argument du script (
$1
) est une référence (tag, hachage, ...) au commit à partir duquel vous souhaitez conserver votre historique.NOTEZ que les anciennes balises resteront toujours présentes; vous devrez peut-être les supprimer manuellement
remarque: je sais que c'est presque la même réponse que @yoyodin, mais il y a quelques commandes et informations supplémentaires importantes ici. J'ai essayé de modifier la réponse, mais comme il s'agit d'un changement substantiel de la réponse de @ yoyodin, ma modification a été rejetée, alors voici les informations!
la source
git prune
etgit gc
. Y a-t-il une explication pour le reste des commandes dans le script? En l'état, il n'est pas clair quels arguments lui sont transmis et ce que fait chaque commande. Merci.-p
à larebase
commande, comme suggéré dans une autre réponseEssayez cette méthode Comment tronquer l'historique git :
Voici
$1
SHA-1 de la validation que vous souhaitez conserver et le script créera une nouvelle branche qui contient toutes les validations entre$1
etmaster
que tout l'historique plus ancien est supprimé. Notez que ce script simple suppose que vous n'avez pas de branche existante appeléetemp
. Notez également que ce script n'efface pas les données git de l'ancien historique. Exécutezgit gc --prune=all && git repack -a -f -F -d
après avoir vérifié que vous voulez vraiment perdre tout l'historique. Vous pouvez également avoir besoinrebase --preserve-merges
mais soyez averti que l'implémentation git de cette fonctionnalité n'est pas parfaite. Inspectez les résultats manuellement si vous utilisez cela.la source
rebase
étape. Étrange - je ne m'attendais pas à ce que des conflits de fusion soient possibles dans ces circonstances.git commit --allow-empty -m "Truncate history"
si la validation que vous avez extraite ne contient aucun fichier.Comme alternative à la réécriture de l'histoire, envisagez d'utiliser
git replace
comme dans cet article du livre Pro Git . L'exemple décrit implique le remplacement d'une validation parent pour simuler le début d'un arbre, tout en conservant l'historique complet en tant que branche distincte pour la conservation.la source
git replace
. Je crois que cela a été corrigé sur une autre question où vous avez posté cette réponse.git replace
versusgit graft
est faite à stackoverflow.com/q/6800692/873282Si vous souhaitez conserver le référentiel en amont avec un historique complet , mais des extractions locales plus petites, effectuez un clonage superficiel avec
git clone --depth=1 [repo]
.Après avoir poussé un commit, vous pouvez faire
git fetch --depth=1
pour tailler les vieux commits. Cela rend les anciens commits et leurs objets inaccessibles.git reflog expire --expire-unreachable=now --all
. Pour expirer tous les anciens commits et leurs objetsgit gc --aggressive --prune=all
enlever les anciens objetsVoir aussi Comment supprimer l'historique git local après un commit?.
Notez que vous ne pouvez pas pousser ce dépôt "superficiel" ailleurs: "mise à jour superficielle non autorisée". Voir Rejeté à distance (mise à jour superficielle non autorisée) après avoir changé l'URL distante de Git . Si vous le souhaitez, vous devez vous en tenir à la greffe.
la source
J'avais besoin de lire plusieurs réponses et quelques autres informations pour comprendre ce que je faisais.
1. Ignorez tout ce qui est plus ancien qu'un certain commit
Le fichier
.git/info/grafts
peut définir de faux parents pour un commit. Une ligne avec juste un ID de validation indique que la validation n'a pas de parent. Si nous voulions dire que nous ne nous soucions que des 2000 derniers commits, nous pouvons taper:git rev-parse nous donne l'id de commit du 2000ème parent du commit actuel. La commande ci-dessus écrasera le fichier de greffons s'il est présent. Vérifiez s'il est là en premier.
2. Réécrivez l'historique Git (facultatif)
Si vous voulez faire de ce faux parent greffé un vrai, exécutez:
Cela changera tous les ID de validation. Chaque copie de ce référentiel doit être mise à jour avec force.
3. Nettoyer l'espace disque
Je n'ai pas fait l'étape 2, car je voulais que ma copie reste compatible avec l'amont. Je voulais juste économiser de l'espace disque. Pour oublier tous les anciens commits:
Alternative: copies superficielles
Si vous disposez d'une copie superficielle d'un autre référentiel et que vous souhaitez simplement économiser de l'espace disque, vous pouvez mettre à jour
.git/shallow
. Mais attention, rien ne pointe vers un commit d'avant. Vous pouvez donc exécuter quelque chose comme ceci:L'entrée en superficiel fonctionne comme une greffe. Mais attention à ne pas utiliser de greffes et peu profondes en même temps. Au moins, ne contient pas les mêmes entrées, cela échouera.
Si vous avez encore d'anciennes références (balises, branches, têtes distantes) qui pointent vers des validations plus anciennes, elles ne seront pas nettoyées et vous n'économiserez pas plus d'espace disque.
la source
git replace
place. Voir stackoverflow.com/questions/6800692/…Lorsque rebase ou push to head / master cette erreur peut se produire
Pour résoudre ce problème dans le tableau de bord git, supprimez la branche principale des "branches protégées"
alors vous pouvez exécuter cette commande
ou
la source
Il y a trop de réponses ici qui ne sont pas actuelles et certaines n'expliquent pas complètement les conséquences. Voici ce qui a fonctionné pour moi pour réduire l'historique en utilisant le dernier git 2.26:
Créez d'abord un commit factice. Ce commit apparaîtra comme le premier commit de votre dépôt tronqué. Vous en avez besoin car ce commit contiendra tous les fichiers de base de l'historique que vous conservez. Le SHA est l'ID de la validation précédente de la validation que vous souhaitez conserver (dans cet exemple,
8365366
). La chaîne 'Initial' apparaîtra comme message de validation du premier commit. Si vous utilisez Windows, tapez la commande ci-dessous à partir de l'invite de commande Git Bash.Commande ci - dessus imprimera SHA, par exemple,
d10f7503bc1ec9d367da15b540887730db862023
.Tapez maintenant:
Cela placera d'abord tous les fichiers à partir de la validation
8365366
dans la validation fictived10f750
. Ensuite, il rejouera toutes les validations après 8365366 par dessusd10f750
. Enfinmaster
, le pointeur de branche sera mis à jour pour que le dernier commit soit lu.Maintenant, si vous voulez pousser ces repo tronqués, faites simplement
git push -f
.Peu de choses à garder à l'esprit (cela s'applique à d'autres méthodes ainsi qu'à celle-ci): les balises ne sont pas transférées. Alors que les ID de validation et les horodatages sont préservés, vous verrez GitHub afficher ces validations en en-tête comme
Commits on XY date
.Heureusement, il est possible de conserver l'historique tronqué en tant qu '"archive" et, plus tard, vous pouvez joindre le référentiel réduit avec le référentiel d'archives. Pour ce faire, consultez ce guide .
la source
vous pouvez supprimer le répertoire, les fichiers et aussi tout l'historique lié au répertoire ou au fichier en utilisant le pot mentionné ci-dessous [le télécharger] et les commandes
Fichier bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
git clone --bare repo-url cd repo_dir java -jar bfg.jar --delete-folder dossier_name git reflog expire --expire = now --all && git gc --prune = now --aggressive git push --mirror repo_url
la source
la source