Scenariusz jest następujący:git filtr-branch doprowadził do rozłączonej historii: jak pozbyć się starych zobowiązań?
Mam duże repozytorium CVS, które chcę przekonwertować na 14 odrębnych repozytoriów git. Część procesu jest w porządku i prowadzi do repo.git dużego repozytorium.
Dla każdego z repo 14 git, ja sklonować głównego repo i uruchom następujące polecenie:
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
Jednakże przed tym poleceniu muszę wykonać kolejne polecenie git filter-branch
dla niektórych repozytoriów git ponieważ Muszę przepisać zatwierdzenia, aby przenieść plik z katalogu do innego. --tree-filter
jest opcją, której używam. Oto przykład z wiersza poleceń wykonywane:
script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
Pod koniec procesu (14500 commity: trwa około 1 godziny!) Czyścić sędziowie i używać git gc
:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
Na na koniec dostaję repozytorium o wielkości 1.2Go (co oczywiście jest wciąż zbyt duże), a patrząc na zatwierdzenia, widzę, że wiele starych wciąż jest obecnych. Dotyczą plików i katalogów, których nie powinno już tu być po komendzie --subdirectory-filter
.
W historii zobowiązuje, nie ma ciągłości między niechcianych zatwierdzeń i tych dobrych, jak widać na gitk --all
:
Jestem prawie pewien, że te rewizje są nadal obecne ze względu na tagi na niektórych na nich. Jeśli tak, to czy możliwe jest usunięcie tych tagów bez usuwania tego na dobrym zatwierdzeniu?
Jeśli tagi nie są powodem, żadnego pomysłu?
Aby uzyskać więcej informacji, zawartość katalogu refs
(w repozytorium git podkatalogu uzyskanych przez filtr) jest pusta:
$ ls -R refs/
refs/:
heads original tags
refs/heads:
refs/original:
refs
refs/original/refs:
heads tags
refs/original/refs/heads:
refs/original/refs/tags:
refs/tags:
Odkryłam, że gałęzie i tagi są wymienione w pliku packed-refs
w repozytorium git:
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
W pliku znajduje się 817 znaczników i 219 gałęzi.
'git gc' zapakuje tag refs do .git/packed-refs, stąd puste katalogi. Nie jestem pewien, dlaczego znaczniki wskazywałyby na stare zatwierdzenia, biorąc pod uwagę, że każda operacja filtru-op używała '--tag-name-filter' ... – torek
Czy sprzątałeś zgodnie z 4 poleceniami tego wpisu ?http://stackoverflow.com/a/7966852/11343 – CharlesB
Oprócz 'reset hard', zrobiłem polecenie 3 innych, jak wspomniano w moim pytaniu (' rm -rf .git/refs/original/'nie jest napisane w ten sam sposób, ponieważ mam puste repozytorium). Nie użyłem opcji '--agressive' gc, ale nie mogę spróbować (nie sądzę, żeby to zmieniło cokolwiek). – Frodon