Kjøre en Git server

Introduksjon

Denne delen vil beskrive hvordan du setter opp, administrerer og sikrer en git server. Git har mange alternativer tilgjengelig. For mer detaljert dokumentasjon se https://git-scm.com/book/en/v2.

Server Avhengigheter

Påkrevd

git-2.44.0 og OpenSSH-9.6p1

Sette opp en Git Server

Følgende instruksjoner vil installere en git server. Det vil bli satt opp til å bruke OpenSSH som sikker ekstern tilgangsmetode.

Konfigurasjon av serveren består av følgende trinn:

1. Sette opp brukere, grupper og tillatelser

Du må være bruker root for den første delen av konfigurasjonen. Opprett git bruker og gruppe og sett en ubrukelig passordhash med følgende kommandoer:

groupadd -g 58 git &&
useradd -c "git Owner" -d /home/git -m -g git -s /usr/bin/git-shell -u 58 git &&
sed -i '/^git:/s/^git:[^:]:/git:NP:/' /etc/shadow

Sett inn en ubrukelig passordhash (erstatter ! med NP) låser opp kontoen, men den kan ikke brukes for å logge på via passordautentisering. Det kreves av sshd for å fungere skikkelig. Deretter oppretter du noen filer og mapper i hjemmemappen til git brukeren som gir tilgang til git depotet ved å bruke ssh nøkler.

install -o git -g git -dm0700 /home/git/.ssh &&
install -o git -g git -m0600 /dev/null /home/git/.ssh/authorized_keys

For enhver utvikler som bør ha tilgang til depotet legg til hans/hennes offentlige ssh nøkkel til /home/git/.ssh/authorized_keys. Først må du legge til noen alternativer for å hindre brukere fra å bruke tilkobling til git for portvideresending til andre maskiner som git serveren kan nå.

echo -n "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty " >> /home/git/.ssh/authorized_keys &&
cat <user-ssh-key> >> /home/git/.ssh/authorized_keys

Det er også nyttig å angi standardnavnet til den første grenen av nye depoter ved å endre git konfigurasjonen. Som root bruker, kjør:

git config --system init.defaultBranch trunk

Legg til slutt til /usr/bin/git-shell inngang til /etc/shells konfigurasjonsfil. Dette skallet har blitt satt i git brukerprofil og sørger for at kun git relaterte handlinger kan utføres:

echo "/usr/bin/git-shell" >> /etc/shells

2. Lag et git depot

Depotet kan være hvor som helst på filsystemet. Det er viktig at git brukeren har lese-/skrivetilgang til den plasseringen. Vi bruker /srv/git som basismappe. Lag et nytt git depot med følgende kommandoer (som root bruker):

[Note]

Note

I alle instruksjonene nedenfor bruker vi project1 som et eksempel på depotnavn. Du bør navngi depotet ditt som et kort beskrivende navn for ditt spesifikke prosjekt.

install -o git -g git -m755 -d /srv/git/project1.git &&
cd /srv/git/project1.git                             &&
git init --bare                                      &&
chown -R git:git .

3. Fyll ut depotet fra et klientsystem

[Note]

Note

Alle instruksjonene i denne delen og den neste bør gjøres på et brukersystem, ikke på serversystemet.

Nå som depotet er opprettet, kan det brukes av utviklere til å legge inn noen filer i den. Når ssh nøkkelen til brukeren er importert til git sin authorized_keys fil, kan brukeren samhandle med depotet.

En minimal konfigurasjon bør være tilgjengelig på utviklerens system som spesifiserer brukernavnet og e-postadressen. Lag denne minimale konfigurasjonsfilen på klientsiden:

cat > ~/.gitconfig <<EOF
[user]
        name = <users-name>
        email = <users-email-address>
EOF

På utviklerens maskin, sett opp noen filer som skal skyves til depotet som det første innholdet:

[Note]

Note

gitserver begrepet som brukes nedenfor skal være vertsnavnet (eller ip adressen) til git serveren.

mkdir myproject
cd myproject
git init --initial-branch=trunk
git remote add origin git@gitserver:/srv/git/project1.git
cat >README <<EOF
This is the README file
EOF
git add README
git commit -m 'Initial creation of README'
git push --set-upstream origin trunk

Det første innholdet blir nå sendt til serveren og er tilgjengelig for andre brukere. På den gjeldende maskinen er argumentet --set-upstream origin trunk er ikke lenger nødvendig siden det lokale depotet er koblet til det eksterne depotet. Påfølgende dytt kan utføres som

git push

Andre utviklere kan nå klone depotet og gjøre endringer i innholdet (så lenge ssh nøklene deres har blitt installert):

git clone git@gitserver:/srv/git/project1.git
cd project1
vi README
git commit -am 'Fix for README file'
git push
[Note]

Note

Dette er et veldig grunnleggende serveroppsett basert på OpenSSH adgang. Alle utviklere bruker git brukeren for å utføre handlinger på depotet og endringene brukere foretar kan skilles ut som det lokale brukernavnet (se ~/.gitconfig) er registrert i endringssett.

Tilgangen er begrenset av de offentlige nøklene som er lagt til git sin authorized_keys filen og det er ingen mulighet for publikum til å eksportere/klone depotet. For å aktiver dette, fortsett med trinn 4 for å sette opp git serveren for offentlig lesetilgang.

I URLen som brukes til å klone prosjektet, den absolutte banen (her /srv/git/project1.git) må spesifiseres da depotet ikke er i git sin hjemmemappe, men i /srv/git. For å bli kvitt eksponeringen som avslører strukturen til serverinstallasjonen, en symbolkobling kan legges til i git sin hjemmemappe for hvert prosjekt som dette:

ln -svf /srv/git/project1.git /home/git/

Nå kan depotet klones ved bruk av

git clone git@gitserver:project1.git

4. Konfigure Serveren

Oppsettet beskrevet ovenfor gjør et depot tilgjengelig for autentiserte brukere (med å gi den offentlige ssh nøkkelfilen). Det er også en enkel måte å publisere depotet til uautentiserte brukere — selvfølgelig uten skriveadgang.

Kombinasjonen av tilgang via ssh (for autentiserte brukere) og eksport av arkiver til uautentiserte brukere via nissen er i de fleste tilfeller nok for en utviklingsside.

[Note]

Note

Nissen vil være tilgjengelig på port 9418 som standard. Sørg for at brannmuroppsettet tillater tilgang til denne porten.

For å starte serveren ved oppstart, installer git-daemon oppstartskriptet inkludert i blfs-bootscripts-20240209 pakken:

make install-git-daemon

For å tillate git å eksportere et depot, en fil som heter git-daemon-export-ok kreves i hver depotmappe på serveren. Filen trenger ikke noe innhold, bare dens eksistens muliggjør, dens fravær deaktiverer eksporten av det depotet.

touch /srv/git/project1.git/git-daemon-export-ok

Skriptet for å starte git nissen bruker noen standardverdier internt. Det viktigste er veien til depotmappen som er satt til /srv/git. I tilfelle du av en eller annen grunn har opprettet depotet i en annen plassering, må du fortelle oppstartsskriptet hvor depot er å finne. Dette kan oppnås ved å lage en konfigurasjonsfilen navngitt /etc/sysconfig/git-daemon. Denne konfigurasjonsfilen vil bli importert hvis den eksisterer, noe som betyr at den er det valgfri. Filen kan se ut som:

# Begin /etc/sysconfig/git-daemon

# Specify the location of the git repository
GIT_BASE_DIR="/srv/git/"

# Directories added to whitelist
DFT_REPO_DIR="$GIT_BASE_DIR"

# Add extra options which will appended to the 'git daemon'
# command executed in the boot script
GIT_DAEMON_OPTS=""

# End /etc/sysconfig/git-daemon

Det er bare tre alternativer å angi i konfigurasjonsfilen:

  • GIT_BASE_DIR=<dirname>

    Spesifiser plasseringen av git depoene. Relative stier som brukes når du får tilgang til nissen vil oversettes i forhold til denne mappen.

  • DFT_REPO_DIR=<dirname>

    Denne mappen er lagt til den hvite listen over tillatte mapper. Denne variabelen kan inneholde flere mappenavn, men er vanligvis satt lik GIT_BASE_DIR.

  • GIT_DAEMON_OPTS=<options>

    I tilfelle spesielle alternativer til git daemon kommandoen er nødvendig, må de spesifiseres i denne innstillingen. Et eksempel kan være å justere portnummeret som nissen lytter på. I dette tilfellet, legg til --port=<port number> til denne variabelen. For mer informasjon om hvilke alternativer som kan angis, ta en titt på utdataene til git daemon --help.

Etter å ha startet nissen, kan uautentiserte brukere klone eksporterte depoer ved å bruke

git clone git://gitserver/project1.git

Som basismappen er /srv/git standard (eller satt til en egendefinert verdi i konfigurasjonen), git tolker den innkommende banen (/project1.git) i forhold til den basismappen slik at depotet i /srv/git/project1.git er servert.