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?
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.)
Et si vous utilisez Windows PowerShell:
git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
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