W rzeczywistości jest to możliwe i kwestia ta została podniesiona tutaj kilka razy, chociaż nie ma uniwersalnego sposobu i wygląda na to, że trzeba skomponować własny przepis.
Jeśli chcesz tylko opuścić pliki z my_new_subdir
, musisz usunąć wszystkie pozostałe pliki samodzielnie. Koncepcja jest użycie:
git filter-branch --tag-name-filter cat --index-filter \
'git rm -r --cached --ignore-unmatch
unneeded-subdir-1 unneeded-pattern-* unneeded-etc' \
--prune-empty -f -- --all
następnie do pomocy w znalezieniu co jeszcze muszą być usunięte można użyć sth jak:
git log --name-status --all | grep -P '^\w\s+[\S]+$'
lub nawet np
git log --name-status --all | grep -P '^\w\s+[\S]+$' | \
sed s/^.// | cut -f 1-2 -d '/' | sort -u
ten sposób może znaleźć wszystkie pliki/katalogi (lub tylko pierwsze dwa segmenty ścieżki w drugim przypadku), które były obecne w repozytorium w dowolnym czasie. Po tym można użyć następującego polecenia, aby wyczyścić repo:
git gc --aggressive
Więc po przeniesieniu plików do lewo w my_new_subdir
Użyłem kombinacji powyższych poleceń, aby oczyścić niepotrzebne pliki z historii. Jednak wciąż znajdowałem niezwiązane z sobą połączenia w historii, ale ostatecznie byłem zadowolony z wyniku. Zauważ, że powyżej jest wiele parametrów poleceń git, które są niezbędne do przejścia przez całą historię, gałęzie i znaczniki.
Aby przyspieszyć operacje, możesz zidentyfikować największe części repozytorium do usunięcia w pierwszej iteracji, a następnie wykonaj git gc --aggressive
. Posiadanie procesora i dysku SSD i5 zajęło mi około minuty, aby wykonać jedną iterację git filter-branch
i przetworzono około 1000 wpisów historii.
Interesujące lektury: http://stackoverflow.com/q/5760331/6309, http://stackoverflow.com/a/16416818/6309. Nie jestem pewien, czy to możliwe. – VonC
Sądzę, że ma to sens, ponieważ nie byłoby możliwości użycia starszych zmian, jeśli struktura katalogów jest zupełnie inna. –