J'ai expérimenté l'utilisation de git subtree et j'ai rencontré la situation suivante.
J'ai utilisé git subtree pour ajouter un projet externe à mon référentiel, j'ai intentionnellement gardé toute l'histoire du projet en amont car je veux pouvoir me référer à l'historique du projet et aussi contribuer au projet en amont plus tard.
En fait, un autre contributeur au projet en amont a accidentellement poussé un gros fichier dans la branche principale. Pour résoudre ce problème, le projet en amont a réécrit l'histoire et la force a poussé sur le maître. Lors de la création de mon "monorepo", j'ai inclus ce commit et je voudrais également le supprimer.
Comment puis-je mettre à jour mon référentiel pour refléter la nouvelle histoire de la sous-arborescence?
Ma première tentative a été d'utiliser filter-branch pour supprimer complètement le sous-arbre et tout l'historique.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Une fois que l'ancienne version du sous-arbre a été supprimée, j'ai pu rajouter le sous-arbre en utilisant le nouveau maître en amont. Cependant, cela n'a pas fonctionné car pour une raison quelconque, l'historique des validations apparaît toujours dans la sortie du journal git.
Mise à jour
J'ai écrit les étapes pour créer un exemple reproductible au minimum.
Créez d'abord un dépôt git vide.
git init test-monorepo cd ./test-monorepo
Créez un commit initial.
echo hello world > README git add README git commit -m 'initial commit'
Ajoutez maintenant une sous-arborescence pour un projet externe.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Faites des commits sur le monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Essayez maintenant d'utiliser git filter-branch pour supprimer la sous-arborescence.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Examinez la sortie du journal git, je m'attends à voir uniquement ma validation initiale.
git log
git gc --prune=now
supprimerais- je pas seulement les commits qui n'apparaissent pas dans git log
?
git log
, aucun argument et je vois toujours les vieux commits.