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:

  1. Powiedz wszystkim moim programistom, aby zaangażowali się, naciskali i przestali pracować dla trochę.
  2. Zaloguj się na serwer i uruchom filtr na centralnym repo.
  3. niech każdy usunie swoje stare kopie i sklonuje ponownie z serwera.
Czy to brzmi dobrze? Czy to najlepsze rozwiązanie?
Author: Roberto Tyley, 2010-12-14

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.

 18
Author: cdhowie,
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
 9
Author: Roberto Tyley,
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.

 5
Author: Ben Jackson,
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

 3
Author: Jason Axelson,
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