2009-12-30 9 views
9

J'ai accidentellement créé commits par « inconnu » dans mon dépôt, et a décidé d'essayer d'exécuter une commande à partir here:Git - Duplicate commit problème

git filter-branch --commit-filter ' 
     if [ "$GIT_COMMITTER_NAME" = "unknown" ]; 
     then 
       GIT_COMMITTER_NAME=".."; 
       GIT_AUTHOR_NAME=".."; 
       GIT_COMMITTER_EMAIL="..."; 
       GIT_AUTHOR_EMAIL="..."; 
       git commit-tree "[email protected]"; 
     else 
       git commit-tree "[email protected]"; 
     fi' HEAD 

Au début, je pensais que tout allait bien, jusqu'à ce que je remarqué dans gitk que chaque commit avant d'exécuter ceci était dupliqué, pas simplement édité comme je le pensais initialement.

Est-il possible de nettoyer cela?

EDIT: OK, gitk montre à la fois les anciens commits (ceux avec les commiters « inconnus » mélangés) et les nouveaux commits (ceux réécrites), divisé en un certain point à mi-chemin autour. Pensez à un groupe de commits, puis dupliqués (et avec les modifications), et empilés sur ceux d'origine. Ce que je veux faire est si possible, est d'enlever les originaux.

+1

Voyons voir si je reçois ceci: avez-vous un arbre de commit qui ressemble à '... - a - b - c - (*) - a '- b' - c '--d - e', où '(*)' est le commit sur lequel vous avez exécuté la mauvaise commande, '[abc]'' sont des doublons erronés que vous voulez supprimer, et '[de]' vous valide vouloir garder? –

+1

Eh bien, c'est plus compliqué en raison de la branche, mais fondamentalement comme vous l'avez dit, mais je veux garder les '' 'car ils ont les champs d'auteur corrigés. – unrelativity

+1

Bon, alors vous voulez supprimer [abc], mais garder [abc] '? –

Répondre

7

La réponse était les fichiers .git/refs/original, et comment la commande que je trouve ne devrait pas avoir pris fin en HEAD mais avec --tag-name-filter cat -- --all.

Acclamations à _Vi et wereHamster du canal #git pour l'aide.

1

Si vous connaissez le dernier bon commit, enregistrez votre lard avec ceci:

git reset <last_good_commit> # Warp back to a good state. 
git push -f master    # Push the changes up (you need -f to force it to 
           # obliterate old commits). 

Si vous voulez marcher plus attentivement (par exemple, s'il y a de bonnes et de mauvaises commits mélangés après <last_good_commit>), l'utilisation git rebase -i pour choisir les bons qui devraient rester derrière.

+0

Je ne suis pas très familier avec la ligne de commande, et je ne suis pas sûr de ce que la cueillette des cerises ou rebasage sont ... aussi, j'ai ajouté une clarification sur ce que je veux faire. – unrelativity