2010-07-25 3 views
5

J'ai maintenant un grand dépôt de Git klaxonnant, énorme, consommant beaucoup d'espace disque sur GitHub que je veux mettre sur un régime. J'ai besoin de rejeter les anciens commits qui ont été faits au début de l'histoire du projet et qui sont essentiellement sans rapport avec la direction actuelle du projet.git rebase. Comment puis-je l'utiliser pour réduire les rames de commits anciens

Je suis - et serai toujours - le seul utilisateur de ce rapport privé.

Idéalement je pouvais faire quelque chose comme:

git rebase de naissance-de-repo-jusqu'à-un mois il y a

Merci,
Doug

+0

duplication possible de [Comment combiner les deux premières validations d'un référentiel Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Tandis que la question liée ici parle de combiner seulement deux commits, les recettes décrites ici fonctionnent aussi pour plus de commits. –

+0

Merci Pavel. Je vérifierai. – dugla

+0

Voulez-vous compresser toutes ces validations en une seule validation, ou voulez-vous vraiment ignorer les modifications introduites? Sur la base de vos commentaires que vous voulez "jeter" et que le projet va dans une direction différente, ce n'est pas tout à fait clair pour moi. – masonk

Répondre

2

En fait, je vais aller avec le vieux git rebase ennuyeux -i HEAD ~ Nombre où le nombre va me ramener de la tête à l'engagement initial. Plus de temps mais au moins j'ai une vague compréhension de ce qu'il fait. Merci pour toutes les suggestions.

1

Voici une recette qui sera travailler dans Git 1.7.2 ou plus récent:

 
start=$starting_sha1 
git checkout --orphan new_master $start 
git commit -m 'new root' 
git rebase --onto new_master $start master 
git checkout master 
git reset --hard new_master 
git push -f origin master 

nettoyer les objets anciens que vous ne référence plus est plus de travail, car ils c ould être pointée par reflogs, Stash, étiquettes, d'autres branches, etc. Une fois que vous êtes sûr ceux-ci sont fixés ou enlevés, un ou plusieurs des éléments suivants devraient aider:

 
git prune 
git gc 
git repack -ad 
7

L'option --squash-git merge pourrait être utile, et est disponible dans git 1.4.1 et plus tard. Cela déclenche les effets d'une fusion, mais ne crée pas de validation. Donc, si 143eff est le plus ancien de vous engager à inclure dans la squashed commettras, votre succursale est master et commit « il y a un mois » est dcb7e5, vous pouvez faire:

# Save the old position of "master" by creating a branch old-master: 
$ git checkout master 
$ git branch old-master 

# Create and checkout a branch called "new-master" that's at the old commit: 
$ git checkout -b new-master 143eff 

# Stage the effects of merging the "one month ago" commit: 
$ git merge --squash dcb7e5 
Updating 143eff3..dcb7e5b 
Fast-forward 
Squash commit -- not updating HEAD 
[... status output showing the staged changes ..] 

# Create the squashed commit: 
$ git commit -m "A commit squashing history up to a month ago" 
# (You could use --amend if you want them to be squashed into 143eff 
# instead of being a commit after that.) 

Maintenant, vous pouvez vérifier avec git diff dcb7e5 new-master qu'ils sont vraiment les mêmes.

Ensuite, vous voulez rebasage le reste de votre travail sur un nouveau maître:

$ git rebase --onto new-master dcb7e5 master 

qui vous laissera un rebasées master qui devrait avoir l'histoire que vous voulez. . (Encore une fois, vous pouvez le vérifier avec git diff old-master master et git log Lorsque vous poussez maître vous GitHub devrez ajouter --force depuis que vous avez réécrit l'histoire:

# Push master to github, with "--force", since you've rewritten history: 
$ git push --force origin master 

Vous pouvez maintenant supprimer new-master, qui est à la commettre squash, avec:

git branch -d new-master 

Apparemment github court git gc --auto sur pousse, vous devriez voir un peu d'espace sauver bientôt ...

+0

Cela a fonctionné comme un charme - merci Mark! – Itay

Questions connexes