Jeden prosty (ale wolny) sposób, aby to zrobić jest z git filter-branch
i --prune-empty
. Bez żadnych innych filtrów żadne inne zatwierdzenia nie zostaną zmienione, ale wszystkie puste zostaną odrzucone (co spowoduje, że wszystkie kolejne zatwierdzenia będą miały nowe identyfikatory nadrzędne i dlatego nadal "przepisuje historię": nie jest to wielka sprawa, jeśli to jest twoje początkowe importuj z hg do git, ale jest to wielka sprawa, jeśli inni już używają tego repozytorium).
Należy zwrócić uwagę na wszystkie typowe zastrzeżenia z odgałęzieniem filtra. (Również, jak na marginesie, "puste zatwierdzenie" jest tak naprawdę tym samym drzewem, co poprzednie zatwierdzenie: nie jest tak, że nie ma żadnych plików, to że ma wszystkie te same pliki, z tymi samymi trybami, i te same treści, jak jego rodzic popełnić. to dlatego, że przechowuje git kompletne migawki dla każdego popełnić, nie różnice z jednej zobowiązać się do następnego.)
Oto mały przykład, który kryje w sobie wiele miejsc, które można zrobić bardziej wyszukane rzeczy:
$ ... create repository ...
$ cd some-tmp-dir; git clone --mirror file://path-to-original
(ten pierwszy krok jest klonem dla bezpieczeństwa: filter-branch
może być bardzo destrukcyjne, więc jest to zawsze dobry, aby rozpocząć go na nowego klonu R niższy niż oryginał. Korzystanie --mirror
oznacza wszystkie swoje oddziały i znaczniki są dublowane w tej kopii, zbyt)
$ git filter-branch --prune-empty --tag-name-filter cat -- --all
(Teraz czekać potencjalnie bardzo długo;. Zobaczyć dokumentację na temat metod, aby to przyspieszyć trochę)
$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
.
(Ten krok jest kopiowany z dokumentacji: odrzuca wszystkie oryginalne gałęzie przed uruchomieniem filtru, innymi słowy powoduje, że filtrowanie jest trwałe, ponieważ jest to klon, co jest dość bezpieczne, nawet jeśli filtr był źle.)
$ cd third-tmp-dir; git clone --mirror file://path-to-filtered-tmp
(To sprawia, czyste, ładnie sprężonego kopię przefiltrowanej egzemplarzu, bez pozostawionych obiektów z etapów filtracji.)
$ git log # and other commands to inspect
Gdy masz pewność, że klon przefiltrowanej klon jest dobre, nie potrzebujesz przefiltrowanego klonu i możesz użyć ostatniego klonu zamiast pierwszego. (To znaczy, można zastąpić „prawdziwy oryginał” z ostatecznym klonie.)
Czy możesz pokazać mi przykład, jak z niego korzystać?Przepraszam za prośbę, ale jestem nowy, by git – Greeso
Thaks, uratowałeś mnie. Będzie nad tym teraz pracować. – Greeso