Git — ewidencja pracy twórczej

Autor
Damian
Terlecki
4 minuty
Inne

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.

  1. 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;
  1. tee /dev/tty — wypisanie wyjścia poprzedniego polecenia na ekranie (terminalu) i przekazanie danych dalej;
  2. awk -F" " '{ print $1 }' — wypisanie pierwszej wartości (hash) po podzieleniu linii względem znaków spacji;
  3. 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'"
  1. 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.