2013-02-14 13 views
6

Chciałbym usunąć reposy, z których nie korzystam z mojego komputera. Sprawdzam coś, pracuję nad tym i kiedy skończę, pcham wszystko i usuwam folder z mojego komputera. W ten sposób wszystko pozostaje uporządkowane, łatwo jest uzyskać ogólny przegląd tego, nad czym pracuję i wiem, że nie mam żadnych lokalnych rzeczy, które czekają, aby je przepchnąć.Jak zapewnić, że wszystko zostało pchnięte gitem?

Ale ...

Przed usunięciem mojego lokalnego repo Chcę upewnić, że wszystko zostało zepchnięte na moim pilocie. Proces, przez który przechodzę, to zazwyczaj te trzy kroki:

git st # check if there's something I haven't committed 

git stash list # check if I've stashed something 

git log --oneline --decorate --all # check if all branches have been pushed 

Chciałbym to uprościć. Szczególnie ostatni krok, który wymaga od mnie spojrzenia na wszystkie moje gałęzie i zobaczenia, czy lokalne i zdalne są zsynchronizowane. Aby być naprawdę pewnym, mógłbym nawet przewinąć trochę, aby upewnić się, że niczego nie brakuje.

Rozważam napisanie skryptu do robienia tego wszystkiego automatycznie, ale może istnieje już rozwiązanie? (Rozumiem, że nie muszę podkreślać, że chcę to zrobić w linii poleceń i nie używać żadnych wymyślnych GUI: D)

Jak się do tego zbliżacie? Jaki jest twój proces sprawdzania, czy niczego nie zapominasz? Z jakich narzędzi korzystasz? Wszystkie pomysły są mile widziane!

Odpowiedz

5

Aby sprawdzić, czy gałąź lokalna i zdalna są zsynchronizowane, należy porównać wartości skrótów wersji HEAD.

Po wykonaniu git branch -v -a otrzymasz listę oddziałów lokalnych i zdalnych wraz z mieszań z odpowiednimi wersjami głowy:

$ git branch -v -a 
    develop        44e61b5 <Commit message> 
    feature/CodeContracts    c26edee <Commit message> 
* feature/Foo       3a40e22 <Commit message> 
    master        e68e28a <Commit message> 
    remotes/origin/HEAD     -> origin/master 
    remotes/origin/develop    44e61b5 <Commit message> 
    remotes/origin/feature/Bar   be9666c <Commit message> 
    remotes/origin/master    e68e28a <Commit message> 

Jak można łatwo zobaczyć, rozwijać i mistrz są up-to-date lokalnie i zdalnie, feature/Bar nie istnieje lokalnie, a feature/CodeContracts i feature/Foo nie istnieją zdalnie, więc powinny zostać wypchnięte przed usunięciem lokalnego repozytorium.

+0

Jeszcze lepiej: użyj "git branch -vva" (uwaga double-v). Spowoduje to również wydrukowanie gałęzi upstream, w której została ustawiona, co stanie się oczywiste, jeśli coś nie zostało popchnięte. W ten sposób porównanie SHA1 będzie konieczne tylko dla lokalnych oddziałów bez gałęzi upstream. – sleske

+0

@sleske: Okazało się, że wprowadzam w błąd. Wypisuje nieistniejącą gałąź zdalną dla gałęzi funkcji 'Foo'. –

+0

Byłoby miło, gdyby downvoter mógł zostawić komentarz. W przeciwnym razie nie mogę naprawić odpowiedzi. –

1

Wielokrotne usuwanie repozytoriów to zła rzecz. Przykładowo repozytorium Linux ma 126 MB; możesz zobaczyć, jak to się szybko starzeje. Być może pomocny mógłby być this script . Sprawdza wszystkie foldery w katalogu (w tym przypadku /opt) i daje git status każdego z nich.

#!/bin/sh 
warn() 
{ 
    printf '\e[1;35m%s\e[m\n' "$*" 
} 
c() 
{ 
    printf '\ec' 
} 
compgen -d /opt/ | while read k 
do 
    c 
    cd $k 
    git status 
    warn $k 
    read </dev/tty 
done 
+1

Chciałbym usłyszeć bardziej rozbudowaną odpowiedź na pytanie, dlaczego usuwanie lokalnych repozytoriów jest złe. Spodziewałem się, że ktoś to powie, więc teraz zastanawiam się, dlaczego :) Repo Linux jest całkiem złym przykładem, większość mojego kodu jest podzielona na biblioteki, a więc o wielkości mniejsze. Złożyłem około 50 repozytoriów publicznych na Github i mam też może dwadzieścia dwa prywatne. Większość z nich nie zmieniła się ostatnio, więc osobiście nie jestem zainteresowany utrzymywaniem ich wszystkich na swoim dysku przez cały czas. Ale jestem uszy, aby zrozumieć, dlaczego ta praktyka jest zła. – Jakob

3

Opierając się na odpowiedź Daniela Hilgarth jest, polecam następujących czynności

Najpierw uruchom git fetch --all aby upewnić się, że najnowsze zmiany ze wszystkich upstream repozytoriów

następnie uruchomić git branch -vva - (uwaga podwójny -v). Spowoduje to wydruk wszystkich gałęzi (a), a dla każdego oddziału najnowsze zatwierdzenie i informacje na temat gałęzi upstream (jeśli ustawiona jest strona upstream).

Wynik będzie wyglądać następująco:

br1     88006cd Branch 
    br2     0b68b6f [origin/br2] New commit 
    c      9ed6569 Dummy 
* master    f4664d4 [origin/master: ahead 1] my commit 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/br3 9ed6569 Dummy 
    remotes/origin/master 9ed6569 Dummy 

Widać masz cztery lokalne oddziały (Master, c, BR1, Br2). master i br2 mają gałęzie upstream. br2 jest w pełni pchnięty, master ma jedno lokalne zatwierdzenie, które nie zostało jeszcze pchnięte ("naprzód 1").

br1 i c są oddziałami lokalnymi bez informacji wstępnych. W tym celu należy sprawdzić i zdecydować, co robić - mogą one być w pełni połączone i zbędne; lub możesz popchnąć je w górę; lub możesz je scalić lokalnie, np. opanować, a następnie popchnąć to. Aby zobaczyć gałęzie, które nie są w pełni scalone z lokalnym wzorcem, użyj git branch --no-merged master. W tym przykładzie wyświetliłoby się "br1 br2" (ponieważ gałąź c jest przodkiem mistrza).

Wreszcie, można zauważyć, że dla br2 podano początek/br2 gałęzi, która nie istnieje. Oznacza to, że zdalne repozytorium usunęło tę gałąź (i pobrano to usunięcie za pomocą "git remote prune" lub "git fetch -p"). Ponownie, musisz zdecydować, czy chcesz odrzucić lokalne zatwierdzenia, czy ponownie je przepchnąć lub scalić.

+0

+1: "naprzód 1" jest miłe. –

Powiązane problemy