Skip to content
Joachim Neubert edited this page Feb 28, 2024 · 22 revisions

Table of Contents

Häufiger gebrauchte Befehle

Feature Branch löschen

lokal:

  git branch -D issue_xyz

remote:

  git push origin --delete issue_xyz

Installation gitweb

Offenbar nicht im CentOS 7.x Paket für git enthalten, daher git-git19 installiert. Gitweb aus dem rpm verlinkt (/var/www/git) und angepasst, ohne ansonsten git19 zu aktivieren.

zentrales Git Projekt Repository auf ite-git

ite-git ist physisch identisch mit ite-srv24

Schreibzugriff erfolgt stets über ssh mit individuellem User

Anmerkung: Damit man sich per ssh verbinden kann, muss entweder der entsprechende Public-Key hinterlegt werden, oder man benötigt das Passwort für den Linux-Account. (Ggf. beim Admin nachfragen)

  • Projekt-Repository anlegen (reines Repository ohne Working Files, Namenskonvention .git )
  # um Repository mit den richtigen Berechtigungen anzulegen, 
  # individuellen User (nicht root) benutzen
  su - nbt
  cd /srv/git
  git init --bare --shared test1.git   # beschreibbar durch group prod
  • Repository Root in /etc/gitweb.conf eintragen
  • in /srv/git/test1.git
    • Kurzbeschreibung des Projekts als Datei description anlegen
    • Project Owner in config eintragen:
  [gitweb]
    owner = nbt
  • Webzugriff http://ite-git/git (mit Authentication, beschränkt auf ITE)

relocate zentrales Repository

  • auf ite-git
  cd /srv
  mv git-repositories git
  • auf clients
  cd /opt/labs/.git
  vi config  # unter [remote "origin"] neue URL eintragen (url = ssh://nbt@ite-git/srv/git/labs.git)
  • das scheint's schon gewesen zu sein

Repository auschecken

Zugriff per SSH (Gitweb ist nur zum Browsen der Repositories; daher muss der Dateisystem-Pfad (/srv/git/<repo>) benutzt werden):

  • Standard Protokoll
  git clone nbt@ite-git:/srv/git/test1.git
  • git+ssh (liest man ja ab und zu)
  git clone git+ssh://nbt@ite-git/srv/git/test1.git

Anmerkung: Unter Windows (mit Git Extensions) hat nur der erste Weg funktioniert.

Bestehendes (lokales) Repository im zentralen Repository einrichten

Methode 1 (bevorzugt)

Repository auf dem Server wie unter Git#zentrales-git-projekt-repository-auf-ite-git einrichten.

Auf dem Client-Rechner remote "origin" definieren und

  $ git push --mirror origin

bzw.

  $ git push --mirror <user>@ite-git:/srv/git/<project>.git

ausführen.

Anmerkung:

  • --mirror bewirkt, dass alle Branches und Tags etc. in das remote Repository eingespielt werden.

Methode 2

  $ git clone --bare -l /path/to/repo /srv/git/repo.git
  $ rm -rf /path/to/repo

Anmerkungen:

  • -l: erzeugt hardlinks, anstatt die Dateien zu kopieren (ist der Default)
  • Alternative:
  git clone --bare --no-hardlinks /path/to/repo /srv/git/repo.git

Gegenüber der Initialisierung von scratch fehlt hier die shared-Einstellung (die --shared Option von clone macht etwas komplett anderes als bei init).

Dazu muss das Repository nur noch Schreibrechte für die Gruppe prod bekommen.

  $ chgrp -R prod /srv/git/repo.git
  $ chmod -R g+w /srv/git/repo.git

Und als letztes muss (sicherheitshalber?) noch ein Eintrag in die config (/srv/git/repo.git/config)

  [core]
    sharedRepository = true

SeeAlso:

Methode 3 (untested)

  $ mkdir /srv/git/my-repo.git
  $ cd /srv/git/my-repo.git
  $ git --bare init --shared
  $ git --bare fetch /home/alice/myproject master:master

Anmerkungen:

  • Ich habe nicht getestet, ob (oder wie) fetch alle branches klont.
SeeAlso:

Merge von zwei Repositories

[Merging](https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history/)

Anmerkungen zu shared-Repositories

Der gitcvs-migration Guide merkt an, dass es andere Workflows neben dem Workflow gibt, bei dem alle in ein zentrales Repository pushen.

Im propagierten Workflow hat jeder Entwickler ein public Repository und es gibt einen Maintainer, der alle Änderungen begutachtet und zusammenführt, und in ein primary public Repository comitted.

Individuelle Konfiguration

Userspezifisches

Die folgenden Einstellungen sind wichtig für die Commit-Messages und lassen sich später nur mühsam nachholen:

  git config --global user.name "nbt"
  git config --global user.email "j.neubert@zbw.eu"

Der Rest ist Geschmacksache:

  git config --global color.status "auto"

.gitignore

Ein globales .gitignore-File kann mit

  git config --global core.excludesfile ~/.gitignore

verlinkt werden. Zusätzlich können projektspezfische .gitignores eingebunden werden.

Arbeiten mit "Vendor Branches"

Git-Repositories von Drittanbietern einbinden (Beispiel Drupal)

s.: Drupal Git Workflows

Neue Version einer tar.gz-Distribution installieren (Beispiel Fuseki)

    cd /opt/fuseki
    
    # verify being on master branch
    # checkin everything
    /etc/init.d/fuseki stop
    
    # goto vendor branch
    git co jena-fuseki
    rsync -rav --delete --exclude=.git* --exclude=log --exclude=DB --exclude=Lucene extracted_dir/ .
    git diff && git st
    # add any new files
    git ci -am "synced from XXX-distribution.tar.gz"
    
    # back to master branch
    git checkout master
    git merge jena-fuseki
    git push
    
    /etc/init.d/fuseki start

Überführen eines bestehenden SVN-Repositories nach Git

Z.T. überholt

1. Unter /srv/git/ ein neues leeres Repository anlegen:

  git init --bare --shared REPOSITORY.git

2. Ins eigene home Verzeichnis wechseln.

3. Wenn das SVN Repository die Standardstruktur mit den Ordnern trunk, tag und branch besitzt lautet der Befehl zum Übertragen wie folgt:

  git svn clone --trunk=trunk --tags=tag --branches=branch --repack http://ite-svn/repos/ite/REPOSITORY

4. Ins frisch ausgecheckte Repository wechseln cd REPOSITORY

5. und mit

  git push --mirror /srv/git/REPOSITORY.git/

ins zentrale Repository senden.

6. Das temporär im eigenen home Verzeichnis angelegte Repository kann jetzt gelöscht werden.

Einzelne Commits zu Upstream-Repository beitragen

# frischer Branch vom Upstream HEAD
git checkout -b tmp
git fetch upstream
git reset --hard upstream/main

# Ausgewählte Commits einfügen
git cherry-pick <commit-hash>

# temporären Branch pushen (Github bietet Erstellung von Pull Request an)
git push origin tmp:tmp
https://stackoverflow.com/a/25955829

diverse Fehlermeldungen

There is no tracking information for the current branch. (git rebase -i)

  git branch --set-upstream Issue_LABS-49_dbpedia origin/Issue_LABS-49_dbpedia

Bei neuen Branches funktioniert das nicht - vorher einen spezifischen commit, der vor dem beabsichtigten rebase liegt, pushen:

  git push origin 771bd83:refs/heads/Issue_LABS-49_dbpedia

No refs in common and none specified; doing nothing. (git push)

Nach dem Clonen eines leeren Repositories und Committen von Dateien, einmalig

  git push origin master

Erst dann wird der Master-Branch auch Remote angelegt.

SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing ...

(z.B. bei Zugriff auf Github)

  git clone --config "http.sslVerify=false" https://github.com/jneubert/doc.git

bzw. dauerhaft:

  git config --global http.sslVerify false