Eksperymentowałem z użyciem poddrzewa git i napotkałem następującą sytuację.
Użyłem poddrzewa git, aby dodać zewnętrzny projekt do mojego repozytorium, celowo zachowałem całą historię dla projektu wyższego szczebla, ponieważ chcę móc odwoływać się do historii projektu, a także później wnieść swój wkład do projektu wyższego szczebla.
Jak się okazuje, inny współpracownik projektu upstream przypadkowo wypchnął duży plik do gałęzi master. Aby to naprawić, poprzedni projekt przepisał historię i wymusił przekazanie jej na master. Tworząc moje „monorepo”, załączyłem ten zatwierdzenie i chciałbym go również usunąć.
Jak mogę zaktualizować moje repozytorium, aby odzwierciedlić nową historię poddrzewa?
Moja pierwsza próba polegała na użyciu gałęzi filter do całkowitego usunięcia poddrzewa i całej historii.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Po usunięciu starej wersji poddrzewa mogłem ponownie dodać poddrzewo, korzystając z nowego wzorca głównego. Jednak to nie zadziałało, ponieważ z jakiegoś powodu historia zatwierdzeń nadal pojawia się w danych wyjściowych dziennika git.
Aktualizacja
Napisałem kroki, aby stworzyć przykład w minimalnym stopniu powtarzalny.
Najpierw utwórz puste repozytorium git.
git init test-monorepo cd ./test-monorepo
Utwórz początkowe zatwierdzenie.
echo hello world > README git add README git commit -m 'initial commit'
Teraz dodaj poddrzewo dla projektu zewnętrznego.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Dokonaj kilku zmian na monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Teraz spróbuj użyć git filter-branch, aby usunąć poddrzewo.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Sprawdź dane wyjściowe dziennika git, oczekuję, że zobaczę tylko moje początkowe zatwierdzenie.
git log
git gc --prune=now
usunę tylko zatwierdzeń, które się nie pojawiają git log
?
git log
, bez argumentów i wciąż widzę stare zobowiązania.