Ho provato a usare git subtree e ho riscontrato la seguente situazione.
Ho usato git subtree per aggiungere un progetto esterno al mio repository, ho intenzionalmente conservato tutta la cronologia del progetto a monte poiché desidero poter fare riferimento alla storia del progetto e contribuire anche al progetto a monte in un secondo momento.
A quanto pare, un altro collaboratore del progetto upstream ha inserito accidentalmente un file di grandi dimensioni nel ramo principale. Per risolvere questo problema, il progetto a monte riscrisse la storia e la forza spinse sul master. Quando ho creato il mio "monorepo", ho incluso questo commit e vorrei anche rimuoverlo.
Come posso aggiornare il mio repository per riflettere la nuova cronologia della sottostruttura?
Il mio primo tentativo è stato di utilizzare il filtro-ramo per rimuovere completamente la sottostruttura e tutta la cronologia.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Una volta rimossa la vecchia versione della sottostruttura, ho potuto aggiungere nuovamente la sottostruttura utilizzando il nuovo master upstream. Tuttavia, questo non ha funzionato perché per qualche motivo la cronologia del commit viene ancora visualizzata nell'output del log git.
Aggiornare
Ho scritto i passaggi per creare un esempio minimamente riproducibile.
Per prima cosa crea un repository git vuoto.
git init test-monorepo cd ./test-monorepo
Crea un commit iniziale.
echo hello world > README git add README git commit -m 'initial commit'
Ora aggiungi una sottostruttura per un progetto esterno.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Fai alcuni commit sul monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Ora prova a usare git filter-branch per rimuovere la sottostruttura.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Esaminare l'output del registro git, mi aspetto di vedere solo il mio commit iniziale.
git log
git gc --prune=now
eliminerei solo i commit che non compaiono in git log
?
git log
, senza discussioni e vedo ancora i vecchi commit.