2010-11-14 9 views
23

Czasami korzystam z drogiego połączenia internetowego i chciałbym się dowiedzieć (przynajmniej w przybliżeniu), ile danych zostanie przesłanych do pilota w postaci git push.Przewiduj, ile danych zostanie przesłanych git push

+1

Wydaje się to trudne ... popychania są skompresowane, a więc naprawdę wiadomo, że chcesz przerwać po utworzeniu pakietu, ale przed wysłaniem. Możesz spróbować sprawdzić rozmiar odpowiedniego pakietu, ale to oznacza efektywne pakowanie dwa razy. – Cascabel

Odpowiedz

25

Właściwie, podoba mi się mój komentarz na tyle, aby opublikować go jako odpowiedź!

Po naciśnięciu git tworzy pakiet wszystkich niezbędnych obiektów i przesyła je do pilota. Oznacza to, że szukamy sposobu na przewidzenie rozmiaru paczki. Ponieważ paczki są skompresowane, to bardzo trudno jest zrobić cokolwiek na podstawie różnic lub rozmiarów obiektów; to, co naprawdę chcemy zrobić, to zobaczyć, jak duży będzie ten pakiet. Byłoby miło, gdybyś mógł przerwać popchnięcie, zaraz po tym, jak skonstruował paczkę, i zdecydował się kontynuować w oparciu o rozmiar paczki, ale nie sądzę, że to możliwe. Domyślam się, że próbuję odtworzyć opakowanie, które zostanie popchnięte i sprawdzone.

Plik pakunku to w zasadzie paczka z informacją nagłówka (jeśli chcesz, spójrz na numer the source). Oznacza to, że jest to wygodne porcelanowe polecenie, które utworzy plik o wymaganej wielkości. (Znacznie łatwiejsze niż próbuje użyć pack-objects ręcznie.) Użyj coś takiego:

git bundle create foo.bundle ^origin/master master 

To da ci pakiet zawierający wszystko, co potrzebne, aby dostać się do mistrza, biorąc pod uwagę, że pilot ma pochodzenie/master - dokładnie taka sama rzecz, która powinna zostać popchnięta przez git push origin master. Jeśli masz dodatkowe oddziały, które będziesz naciskał, możesz je również włączyć; po prostu rejestruje się argumenty:

git bundle create foo.bundle ^origin/master master ^origin/topic topic ... 

Wystarczy sprawdzić rozmiar utworzonego pakietu; powinno to być prawie równoznaczne z tym, co w końcu popchniesz. Oznacza to, że będziesz musiał utworzyć pakiet dwa razy (raz z pakietem i raz z naciśnięciem), ale jeśli nie jest to naprawdę duży nacisk, który zajmuje dużo czasu, aby spakować się, to nie powinno być ogromny problem.

2
git diff HEAD origin/master --stat 
+0

Nie wyświetla się przepustowość, otrzymuję: git push --dry-run -v Przesyłanie na adres [email protected]: projekt Do [email protected]: project fbe6184..7b7a3bc master -> master –

+0

@ Gerald, spróbuj zamiast tego użyć polecenia git diff. Przykład zamieszczony powyżej pokazuje, które pliki się zmieniły i ile wierszy wstawek i usunięć w każdym z nich. Czy to wystarczająca ilość informacji? –

+0

to dość nieokreślony szacunek, gdy chodzi o kompresję i różnice binarne. Również żmudne, jeśli istnieje wiele modyfikacji. –

9

można dowiedzieć się prawie dokładnie wykonując podobną trochę bash co Git będzie prowadzony wewnętrznie, gdy tworzy plik pakietu do pchania:

$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c 

Powinno to wyjście bajt-count opakowanie plik Git wyśle. Podziale:

# Find the common ancestor of HEAD and origin/master, and output a 
# revision range (<a>..<b>) string to git pack-objects. 
echo $(git merge-base HEAD origin/master)..HEAD 

# Generate the pack file containing the revision range specified above, writing 
# it to stdout. 
git pack-objects --revs --thin --stdout -q 

# Print the byte count of the file contents passed via stdin. 
wc -c 

Jest to uwarunkowane robi git fetch tuż przed naciskać; jeśli nie, Git nie będzie w stanie znaleźć wspólnego przodka i wyśle ​​zawartość całego repozytorium. Aby uzyskać więcej informacji, patrz this answer.