Mateusz Adamowski Szkolenia

Git - Like a pro!

Mateusz Adamowski

SysOps/DevOps Meetup #73
Warszawa, 2025-03-20


O mnie


Git


Historia powstania


cofnijmy się w czasie do 2000


Rok 2000


CVS (1990)


Torvalds


If you like using CVS, you should be in some kind of mental institution or somewhere else.

(Linus Torvalds)


Jeśli lubisz używać CVS, powinieneś być w zakładzie psychiatrycznym czy gdzieś.

(Linus Torvalds)


Subversion (1995)


Subversion has been the most pointless project ever started… Subversion used to say, ‘CVS done right.’ With that slogan there is nowhere you can go. There is no way to do CVS right.

(Linus Torvalds)


Subversion to najbardziej bezsensowny projekt, jaki kiedykolwiek rozpoczęto… Motto Subversion brzmiało: „CVS zrobione prawidłowo”. Z tym sloganem nie da się nic osiągnąć. Nie da się zrobić prawidłowo CVS.

(Linus Torvalds)


Tux


Linux


For the first 10 years of kernel maintenance, we literally used tarballs and patches, which is a much superior source control management system than CVS is.

(Linus Torvalds)


Przez pierwszych 10 lat rozwoju kernela używaliśmy po prostu archiwów tara i patchy, co jest znacznie lepszym systemem kontroli wersji niż CVS.

(Linus Torvalds)


BitKeeper

(2002)

BitKeeper

Innowacyjne narzędzie do kontroli wersji firmy BitMover.


Darmowa licencja


Flame wars

Flagowy projekt FLOSS zarządzany komercyjnym narzędziem.

vs

I’ll use the best tool for the job and, quite frankly, BitKeeper was it. (Torvalds)


Wycofanie licencji

(2005)


Powstanie Gita


Take CVS as an example of what not to do; if in doubt, make the exact opposite decision

(Linus Torvalds)


Trzeba wziąć CVS jako przykład czego nie robić, a w razie wątpliwości - zrobić odwrotnie.

(Linus Torvalds)


Rozwój gita


Windows?


Windows problems


Are we really contemplating porting git to native Windows?

I guess I missed that memo.


Git for Windows

Git for Windows


Git bash


Git Bash (Windows)


GitHub (2008)


GitLab (2011)


GitHub Actions (2018)


Microsoft?


BitKeeper?


przerwa na pytania


tig

text-mode interface for Git


tig


tig


tig


tig


instalacja

# apt install tig

nawigacja


tig

Filtrowanie commitów danego autora

$ tig --author=Tatham

tig


tig

Filtrowanie commitów dotyczących pliku lub podkatalogu

$ tig ścieżka

tig


tig

Pomijanie commitów merge

$ tig --no-merges

tig


tig


tig

$ tig blame plik

tig


live demo


tig

$ tig --all

tig

$ tig commit-id

etckeeper

automatyczne wersjonowanie /etc


instalacja

# apt install etckeeper

etckeeper zastosowanie


etckeeper


live demo


Hooks


lshooks


Hooki w gicie


pre-commit

precommit


Hooki pre-commit


Instalacja narzędzia

$ apt install pre-commit

alternatywnie:


Dodanie do projektu

.pre-commit-config.yaml

```yaml [1-8|1|2-3|4|5-8|5|6|7|8|1-8] repos:


Integracja z repozytorium

$ pre-commit install

Dodaje hook pre-commit w .git/hooks/


Uruchomienie (ręczne)

precommit


Uruchomienie (pełne)

precommit


Uruchomienie (commit)

precommit


Działanie


zobaczmy stronę projektu

https://github.com/pre-commit/pre-commit-hooks


Więcej hooków


Github Actions

name: pre-commit

on:
  pull_request:
  push:
    branches: [main]

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v3
    - uses: pre-commit/action@v3.0.1

Gitlab Pipeline

pre-commit:
  image: docker.io/jfxs/pre-commit:latest
  stage: test
  script:
    - task --taskfile /lint.yml pre-commit DIR=$(pwd)

CODEOWNERS


.gitlab-ci              @xxx
/dir1/                  @admins
/apps/                  @mateusz @pawel
/apps/github            @xteam

Podpisywanie commitów


sign


sign


Generowanie klucza

$ ssh-keygen -t ed25519

Konfiguracja

```shell [1-3|1|2|3|1-3] $ git config –global user.signingkey ~/.ssh/id_ed25519.pub $ git config –global gpg.format ssh $ git config –global commit.gpgsign true


---
### Upload klucza GitLab

![Klucz](img/gitlab-ssh-key.png)

---
## Upload klucza GitHub

![Klucz](img/github-ssh-key.png)

------
<!-- .slide: data-autofragments -->
# git worktree

- osobny katalog dla gałęzi
- alternatywa dla `git switch` (`git checkout`)

---
## stworzenie worktree

```shell [1-3|1|2|3|1-3]
$ git branch ABC-10
$ git worktree add ../ABC-10
$ cd ../ABC-10

usunięcie worktree

```shell [1-2|1|2|1-2] $ git worktree list $ git worktree remove ../ABC-10


------
<!-- .slide: data-autofragments -->

# praca z dużymi repo
<!-- .element: style="font-size: 2em;" -->

- niepotrzebna historia
- niepotrzebne podkatalogi
- długi czas klonowania
- zmarnowane miejsce na dysku

---
<!-- .slide: data-autofragments -->
## płytki klon

```shell
$ git clone --depth=2 "$REPO"

Tylko 2 ostatnie commity.


rzadki checkout

sparse

```shell [1-5|1|2|3|4|5|1-5] $ git clone –no-checkout –filter=tree:0 –depth=2 “$REPO” $ cd repo/ $ git sprase-checkout set –no-cone katalog/ $ git checkout $ git sparse-checkout add inny_katalog/


------
<!-- .slide: data-autofragments -->
# monorepo

- duże repozytorium
- misz-masz małych projektów

---
<!-- .slide: data-autofragments -->
## case

Mamy duże repozytorium.

Chcemy wyodrębnić historię jednego podkatalogu

---

```shell
$ export FILTER_BRANCH_SQUELCH_WARNING=1
$ git filter-branch --subdirectory-filter crypto/ -- --all

live demo


Alternatywne narzędzie:

https://github.com/newren/git-filter-repo


case

Mamy dwa różne repozytoria.

Chcemy scalić je w jedno.


$ git remote add repo2 "$REPO2"
$ git fetch repo2
$ git merge --allow-unrelated-histories repo2/master

live demo


Przepisywanie historii


case

Wrzuciliśmy do repozytorium plik, który nie powinien się tam znaleźć.

Musimy przepisać historię.


krok 1

Znajdujemy commit, w którym dokonaliśmy niepożądanej zmiany.


```shell [1-7|1|2|3|4|5|6|7|1-7] $ rm niechciany_plik.txt $ vim plik.txt $ git add . $ git commit -m ‘FIX’ $ git rebase -i ZLY_COMMIT $ ### przenosimy ostatni commit na drugą pozycję $ ### zmieniamy go na “fixup”


---
<!-- .slide: data-background="#401" -->

_live demo_

---
# przepisywanie historii

- projekty jednoosobowe
- tylko nadzwyczajne sytuacje
- najlepiej zablokować na serwerze

------
# git subtree

```shell
$ git subtree --prefix "$TREE" pull "$SRC" "$SRC_BRANCH" --squash

live demo


Gitea


Gitea


Gitea


live demo


Szkolenia

https://www.sysopspolska.pl/szkolenia


Slajdy?

mateusza-szkolenia.github.io


Koniec