Zaktualizuj zespół programistów za pomocą przepisanej historii repo Git, usuwając duże pliki
Mam git repo z kilkoma bardzo dużymi binariami. Już ich nie potrzebuję i nie zależy mi na tym, aby móc pobierać pliki z wcześniejszych commitów. Tak więc, aby zmniejszyć rozmiar repo, chcę całkowicie usunąć Pliki binarne z historii.
Po wyszukiwaniu w Internecie doszedłem do wniosku, że mój najlepszy (tylko?) opcją jest użycie git-filter-branch
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD
Czy to wygląda na dobre podejście do tej pory?
Zakładając, że odpowiedź brzmi tak, mam inny problem do rozwiązania. git instrukcja zawiera Ostrzeżenie :
Uwaga! Przepisana historia będzie miała różne nazwy obiektów dla wszystkich obiektów i nie będzie zbieżna z oryginalną gałęzią. Nie będziesz w stanie łatwo wcisnąć i rozprowadzić przepisanej gałęzi na górze oryginalnej gałęzi. Nie używaj tego polecenia, jeśli nie znasz pełnych implikacji i unikaj go, jeśli prosty commit wystarczy, aby rozwiązać twój problem. (Patrz sekcja "odzyskiwanie z UPSTREAM REBASE" w git-rebase(1) Aby uzyskać więcej informacji na temat przepisywania opublikowanej historii.)
Mamy zdalne repo na naszym serwerze. Każdy programista pcha się i ciągnie od niego. Opierając się na powyższym ostrzeżeniu (i moim zrozumieniu, jak działa git-filter-branch
), nie sądzę, że będę w stanie uruchomić git-filter-branch
na mojej lokalnej kopii, a następnie wypchnąć zmiany.
Więc wstępnie planuję przejść przez następujące kroki:
- Powiedz wszystkim moim programistom, aby zaangażowali się, naciskali i przestali pracować dla trochę.
- Zaloguj się na serwer i uruchom filtr na centralnym repo.
- niech każdy usunie swoje stare kopie i sklonuje ponownie z serwera.
4 answers
Tak, Twoje rozwiązanie zadziała. Masz również inną opcję: zamiast robić to na centralnym repo, Uruchom filtr na swoim klonie, a następnie odepchnij go za pomocą git push --force --all
. To zmusi serwer do zaakceptowania nowych gałęzi z twojego repozytorium. Zastępuje to tylko krok 2; pozostałe kroki będą takie same.
Jeśli Twoi programiści są dość zaznajomieni z Gitem, to mogą nie musieć usuwać swoich starych kopii; na przykład, mogą pobrać nowe piloty i zmienić ich gałęzie tematyczne jako odpowiednie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 20:55:49
Twój plan jest dobry (chociaż lepiej byłoby wykonać filtrowanie na gołym klonie twojego repozytorium, a nie na centralnym serwerze), ale zamiast git-filter-branch
powinieneś użyć my BFG Repo-Cleaner, szybszej i prostszej alternatywy dla git-filter-branch
zaprojektowanej specjalnie do usuwania dużych plików z repozytoriów Gita.
Pobierz java jar (wymaga Javy 6 lub nowszej) i uruchom następujące polecenie:
$ java -jar bfg.jar --strip-blobs-bigger-than 1MB my-repo.git
Każdy blob o rozmiarze powyżej 1MB (który nie jest w Twoim najnowszy commit) zostanie całkowicie usunięty z historii Twojego repozytorium. Następnie możesz użyć git gc
, Aby wyczyścić martwe dane:
$ git gc --prune=now --aggressive
BFG jest zwykle 10-50x szybszy niż działanie git-filter-branch
, A opcje są dopasowane do tych dwóch typowych przypadków użycia:
- Usuwanie Crazy Big Files
- usuwanie haseł, poświadczeń i innych prywatnych danych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 13:02:29
Jeśli nie zmusisz programistów do ponownego sklonowania, prawdopodobnie uda im się przeciągnąć duże pliki z powrotem. Na przykład, jeśli starannie połączą się z nową historią, którą utworzysz, a następnie zdarzy się git merge
z lokalnej gałęzi projektu, która nie została zrebasowana, rodzice commita scalającego będą zawierać gałąź projektu, która ostatecznie wskazuje na całą historię, którą wymazałeś za pomocą git filter-branch
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 21:01:21
Twoje rozwiązanie nie jest kompletne. Powinieneś dołączyć --tag-name-filter cat
jako argument filtrowania gałęzi, aby znaczniki zawierające duże pliki również zostały zmienione. Powinieneś również zmodyfikować wszystkie refy zamiast tylko HEAD, ponieważ commit może znajdować się w wielu gałęziach.
Oto jakiś lepszy kod:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' --tag-name-filter cat -- --all
Github ma dobry poradnik: https://help.github.com/articles/remove-sensitive-data
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 21:43:59