web-dev-qa-db-fra.com

Supprimer les références / original / têtes / maître du dépôt git après filter-branch --tree-filter?

J'ai eu la même question que celle posée ici: Nouveau référentiel git dans le répertoire racine pour subsumer un référentiel existant dans un sous-répertoire

J'ai suivi cette réponse ici: Nouveau référentiel git dans le répertoire racine pour subsumer un référentiel existant dans un sous-répertoire

À présent, gitk --all montre deux historiques: l’un aboutissant au master actuel et l’autre nommé original/refs/heads/master.

Je ne sais pas ce que cette deuxième histoire est, ni comment la retirer du référentiel. Je n'ai pas besoin de deux historiques dans mon référentiel.

Comment puis-je m'en débarrasser?

Pour vous reproduire:

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'

Nous avons maintenant le problème de l'affiche originale. Déplaçons la racine du dépôt git vers la racine du projet en utilisant 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, voyez mon problème actuel:

gitk --all &
git show-ref

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

158
goofeedude

refs/original/* est là comme sauvegarde, au cas où vous gâcheriez votre branche de filtre. Croyez-moi, c'est une bonne idée .

Une fois que vous avez inspecté les résultats et que vous êtes certain de disposer de ce que vous voulez, vous pouvez supprimer la référence sauvegardée:

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

ou si vous avez fait cela à de nombreux arbitres et que vous voulez tout effacer:

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

(Cela provient directement de la page de manuel filter-branch.)

Cela ne s’applique pas à vous, mais aux autres qui pourraient trouver ceci: Si vous faites une branche de filtre qui supprime le contenu occupant beaucoup d’espace disque, vous voudrez peut-être aussi exécuter git reflog expire --expire=now --all et git gc --Prune=now pour expirer vos réflexions et supprimer les objets inutilisés. (Attention: complètement, totalement irréversible. Soyez très sûr avant de le faire.)

288
Cascabel

Et si vous utilisez Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
9
Guilherme Duarte

filter-branch conserve les sauvegardes, le référentiel doit donc nettoyer les données de collecte et de récupération de place. Assurez-vous de ne pas avoir besoin de ces sauvegardes avant la suppression:

rm -Rf .git/refs/original
git gc --aggressive --Prune=now
3
Kiryl Plyashkevich