2011-09-26 17 views
11

Nasze repozytorium git ma wiele dużych plików w swojej historii, które nie są już potrzebne. Chcę, aby je usunąć przy użyciu techniki filtra oddział wyjaśnione Pro Git:Przebudowywanie wszystkich zmian w historii git po filtrze filtracyjnym

http://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery

Zaraz potem wykorzystać git push --force all wysłać to do naszej wspólnej repo, jak wyjaśniono tutaj:

Update a development team with rewritten Git repo history, removing big files

ALE. Pro Git mówi, że będę musiał mieć wszystkich na bazie, odkąd zmieniam historię. Użyliśmy tylko oszczędnie bazy, zwykle jako alternatywnej metody scalania. Mogę kazać wszystkim ponownie klonować, ale to ostatnia deska ratunku; kilku deweloperów ma lokalne oddziały ze zmianami, które chcieliby zachować.

A więc: co dokładnie wszyscy będą robić w naszych lokalnych repozytoriach, aby dokonać ponownego wyboru na nowo zmienione udostępnione repo? I czy musimy to robić raz w każdej gałęzi śledzenia? Nasze repo jest nazywane początkiem, a master jest mistrzem, jeśli chcesz dawać krok po kroku (i bardzo bym chciał, gdybyś tak zrobił).

Odpowiedz

3

Oto opcja.

  • Stwórz rebased mistrz na oddział o nazwie rebased_master (zamiast oryginalnego master).
  • Nie popchnąłbyś tej gałęzi i kazałeś wszystkim swoim programistom ściągnąć ją i zmienić bazę lokalnych oddziałów na rebased_master. Jeśli odrzuci je od równoważnego zatwierdzenia sprzed bazy danych i nie będzie żadnych zmian w usuniętych plikach, wszystkie powinny być dobrze.
  • Kiedy wszyscy przeniósł swoje oddziały dev do rebased_master, można usunąć swój oryginalny master i moverebased_master do master

uwaga: nie testowałem tego, więc upewnij się, że masz kopię repo do przywrócić na wypadek, gdyby coś poszło nie tak.

+1

To brzmi dobrze - przyjmuję to rano, po tym, jak to działa! –

+3

Tak? Czy to działa? Ten poranek minął, jak sądzę ... – marton78

14

Kluczem jest to, aby każdy indywidualny programista nie utracił oryginalnego odniesienia do master, dopóki nie wykonają one swojego ponownego wyboru. Aby to zrobić, należy je robić fetch (nie pull) po przymusowej naciśnięciem, a następnie dla każdego lokalnego oddziału, zrobić:

git rebase --onto origin/master master <local_branch> 

Kiedy to się stało, wtedy mogą kasy ich master i aktualizować je przez :

git pull --force 
Powiązane problemy