Mateusz Adamowski
SysOps/DevOps Meetup #73
Warszawa, 2025-03-20
cofnijmy się w czasie do 2000
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)
chmod
)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)
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)
Innowacyjne narzędzie do kontroli wersji firmy BitMover.
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)
(2005)
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)
hg
)bzr
)Are we really contemplating porting git to native Windows?
I guess I missed that memo.
bash
)awk
, sed
, grep
…perl
, GPG
przerwa na pytania
text-mode interface for Git
# apt install tig
shift-O
- otwarcie commituh j k l
- przewijanie podglądut
- widok drzewab
- blameq
- wyjścieFiltrowanie commitów danego autora
$ tig --author=Tatham
Filtrowanie commitów dotyczących pliku lub podkatalogu
$ tig ścieżka
Pomijanie commitów merge
$ tig --no-merges
$ tig blame plik
live demo
$ tig --all
$ tig commit-id
automatyczne wersjonowanie /etc
# apt install etckeeper
git
FTW!)live demo
.git/hooks/
$ apt install pre-commit
alternatywnie:
brew install pre-commit
pip install pre-commit
.pre-commit-config.yaml
```yaml [1-8|1|2-3|4|5-8|5|6|7|8|1-8] repos:
$ pre-commit install
Dodaje hook pre-commit
w .git/hooks/
zobaczmy stronę projektu
https://github.com/pre-commit/pre-commit-hooks
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
pre-commit:
image: docker.io/jfxs/pre-commit:latest
stage: test
script:
- task --taskfile /lint.yml pre-commit DIR=$(pwd)
.gitlab-ci @xxx
/dir1/ @admins
/apps/ @mateusz @pawel
/apps/github @xteam
$ ssh-keygen -t ed25519
```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

---
## Upload klucza GitHub

------
<!-- .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
```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.
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
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
Wrzuciliśmy do repozytorium plik, który nie powinien się tam znaleźć.
Musimy przepisać historię.
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
live demo
https://www.sysopspolska.pl/szkolenia