2015-02-04 15 views
10

Właśnie zmigrowałem projekt z Mercurial do Git. Mercurial dodaje puste zatwierdzenia, gdy dodajesz znaczniki, więc skończyłem z pustym zatwierdzeniem w Git, które chciałbym usunąć.Usuń puste zatwierdzenia w git

Jak usunąć puste zatwierdzenia (zatwierdzenia, które nie zawierają w nich żadnych plików) od Git?

Dzięki.

Odpowiedz

13

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.)

+0

Czy możesz pokazać mi przykład, jak z niego korzystać?Przepraszam za prośbę, ale jestem nowy, by git – Greeso

+0

Thaks, uratowałeś mnie. Będzie nad tym teraz pracować. – Greeso