Git — ewidencja pracy twórczej
Podczas pracy programisty, może zajść potrzeba ewidencjonowania pracy twórczej. Proces ten, choć z opisu wydaje się prosty, jest niestety dosyć czasochłonny i męczący, gdy potrzeba jest udokumentowania naszych prac z całego miesiąca. Szczęśliwie, korzystając z systemu kontroli wersji Git, za pomocą kilku poleceń możliwe jest stworzenie listy (w postaci plików) wszystkich zmian przez nas wprowadzonych w danym okresie.
Przykład takiego polecenia jest następujący:
git log --pretty="format:%H | Author: %an, %aD | Committer: %cn, %cD | %s" --author="Damian Terlecki" --after="2019-05-01" --before="2019-06-01" | tee /dev/tty | awk -F" " '{ print $1 }' | xargs -I@ bash -c "git show @ > @.txt"
Warunkiem niezbędnym do poprawnego wykonania powyższej linii jest obecność narzędzi uniksowych (tee/xargs/bash) w ścieżce. Na Winsowsie można je opcjonalnie zainstalować (co również zalecam) przy instalacji Gita bądź wykorzystać środowisko Cygwin. Poniżej po kolei wymienię, jak działają poszczególne części potoku.
git log
— wypisanie informacji o commitach;
--pretty="format:%H | Author: %an, %aD | Committer: %cn, %cD | %s"
— interesuje nas głownie autor (%an), data (%aD) oraz tytuł commita (%s), przy okazji mogą przydać informacje o tym, kto i kiedy dodał commita (amend/rebase/patch/cherry-pick);--author="Damian Terlecki"
— filtrujemy po autorze;--after="2019-05-01"
— filtrujemy zmiany z okresu, które zostały dodane po danej dacie (uwaga: data commita, czas lokalny);--before="2019-06-01"
- filtrujemy zmiany z okresu, przed podaną datą (j.w.), ostatecznie osiągając okres danego miesiąca;
tee /dev/tty
— wypisanie wyjścia poprzedniego polecenia na ekranie (terminalu) i przekazanie danych dalej;awk -F" " '{ print $1 }'
— wypisanie pierwszej wartości (hash) po podzieleniu linii względem znaków spacji;xargs -I@ bash -c "git show @ > @.txt"
— wywołanie git show dla argumentu przekazanego przez potok (-I@ definiuje podstawienie tego argumentu w miejsce znaku @) i zapisanie go do pliku z tym samym postfixem.
Wersja bardziej złożona, zaciągająca nazwę projektu z repozytorium:
git log --pretty="format:%H | Author: %an, %aD | Committer: %cn, %cD | %s" --author="Damian Terlecki" --after="2019-05-01" --before="2019-06-01" | tee /dev/tty | awk -F" " '{ print $1 }' | xargs -I@ bash -c "git remote get-url origin | sed -E 's#^.*/(.*)$#\1#' | sed 's#.git$##' | xargs -I! bash -c 'git show @ > !-@.txt'"
git remote get-url origin | sed -E 's#^.*/(.*)$#\1#' | sed 's#.git$##'
— wydobycie nazwy repozytorium, standardowo z origina.
Aby skorzystać ze skryptu, podmieniamy parametry --author
, --before
i --after
, odpalamy i dostajemy listę zmian w postaci pliku dla każdego commita. Składny kawałek kodu nieprawdaż? ... nie? No cóż, prawdopodobnie jest na to prostszy sposób, niemniej jednak ten również spełnia swoje zadanie w moim przypadku. Być może przyda się również Tobie.
Wskazówka 1: Możesz użyć git log --all
bądź ograniczyć wyniki jedynie do zmian w zdalnych repozytoriach poprzez git log --remotes
.
Wskazówka 2: Wywołując git fetch --all
możesz zaktualizować lokalne kopie repozytoriów zdalnych.