Verschil tussen git init en git init --bare
1. git init — normale repository (working repository)
Wanneer je dit doet:
git init
krijg je een repository met een working tree.
Structuur:
project/
├── .git/
│ ├── objects/
│ ├── refs/
│ └── HEAD
├── file1.txt
├── file2.txt
Belangrijk:
- De map .git/ bevat de repository database.
- De bestanden in de map zelf zijn de working tree.
Dus:
.git = git database
rest = werkbestanden
Dit gebruik je wanneer je code ontwikkelt.
Voorbeeld workflow:
git init
git add .
git commit -m "first commit"
Hier kun je bestanden bewerken, committen en testen.
2. git init --bare — bare repository
Wanneer je dit doet:
git init --bare repo.git
krijg je een repository zonder working tree.
Structuur:
repo.git/
├── HEAD
├── objects/
├── refs/
├── config
Dus:
GEEN werkbestanden
alleen git database
Dit type repository is bedoeld als server repository waar anderen naar pushen.
3. Waarom bestaat een bare repo?
Een centrale repository heeft geen werkbestanden nodig.
Een bare repo voorkomt ook conflicten.
Stel je voor dat een server een gewone repo heeft:
server/project/
En iemand pusht terwijl daar ook bestanden staan. Dan kan git de working tree overschrijven.
Daarom gebruiken servers meestal:
repo.git
Alleen git-data.
4. Mijn server setup
Op de server, b.v. klima.git:
mkdir -p /home/pi/repos/
cd /home/pi/repos/
git init --bare klima.git
Dan op je lokale machine:
git remote add origin ssh://pi@dev.public-risk.org:/home/pi/repos/klima.git
alternatief ipv pi@dev.public-risk.org, indien wireguard vpn aan staat:
pi@10.8.0.1
of indien in /etc/hosts de regel 10.8.0.1 vpn voorhanden:
pi@vpn
ip adres van de hetzner server mag ook:
pi@89.167.39.46
daarna eerste push:
git push origin main
5. Waarom de naam .git?
Bare repos krijgen vaak de extensie .git:
project.git
Dit is alleen conventie, maar helpt herkennen dat het een server repository is.
6. Samenvatting
| Kenmerk | git init | git init --bare |
|---|---|---|
| Working files | ja | nee |
.git map |
ja | repo zelf |
| Bedoeld voor | ontwikkeling | server |
| Push target | meestal niet | ja |
| Voorbeeld | laptop project | centrale repo op server |
7. Hoe GitHub / GitLab werken
Wanneer je een repository aanmaakt op GitHub gebeurt intern:
git init --bare
Dus GitHub repositories zijn in feite bare repositories op een server.
8. post receive hook
In de bare repository kan een hook staan, bv voor klima.git:
/home/pi/repos/klima.git/hooks/post-receive
Die automatisch een deploy uitvoert na een git push. In mijn geval deployt hij naar /home/pi/ShinyApps/klima (voor klima.git)