192 votes

Supprimer les refs/original/têtes/master de repo git après filtre-branche-arbre-filtre ?

J'ai eu la même question est posée ici: Nouveau dépôt git dans le répertoire racine de subsumer un existe pas de référentiel dans un sous-répertoire

J'ai suivi cette réponse ici: Nouveau dépôt git dans le répertoire racine de subsumer un existe pas de référentiel dans un sous-répertoire

Maintenant, gitk --all montre deux histoires: l'une qui a culminé dans le courant master, et un nommé original/refs/heads/master.

Je ne sais pas ce que cette deuxième histoire est, ou comment le supprimer de l'opération. Je n'ai pas besoin de deux histoires dans mon référentiel.

Comment puis-je me débarrasser de lui?

Pour reproduire vous-même:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

Maintenant, nous avons l'affiche originale du problème. Passons à la racine du repo git du projet de la racine à l'aide de la réponse ci-dessus:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

Maintenant, mon problème actuel:

gitk --all &
git show-ref

Comment puis-je me débarrasser de l' refs/original/heads/master et tous les associés de l'histoire?

344voto

Jefromi Points 127932

refs/original/* est là comme une sauvegarde, au cas où vous gâcher votre filter-branch. Croyez-moi, c'est une vraiment bonne idée.

Une fois que vous avez inspecté les résultats, et vous êtes très sûr que vous avez ce que vous voulez, vous pouvez supprimer la sauvegarde réf.:

git update-ref -d refs/original/refs/heads/master

ou si vous avez fait cela à de nombreuses références, et vous souhaitez effacer tout:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(C'est pris directement à partir de l'filter-branch page de manuel.)

Cela ne s'applique pas à vous, mais à d'autres personnes qui peuvent trouver ceci: Si vous faites un filter-branch qui supprime le contenu de prendre beaucoup d'espace disque, vous pouvez également exécuter git reflog expire --expire=now --all et git gc --prune=now à échéance de votre reflogs et supprimer les objets inutilisés. (Avertissement: complètement, totalement irréversible. Être très sûr de vous avant de le faire.)

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