Benutzer-Werkzeuge

Webseiten-Werkzeuge

Übersetzungen dieser Seite:
de

programming:git:start

GIT

minimaler clone

git clone --depth 1 https://github.com/frank-w/BPI-R2-4.14
git remote set-branches origin '*'
git fetch --depth 1

Commit nach Autor suchen

git log --author="Frank Wunderlich"

Commits nach Text suchen

in der Commit-Message

git log --grep="hnat"

im Diff (Code-Änderung)

git log -G"hnat"

mehrere Suchkriterien

git log --all-match --grep="hnat" --author=Frank

alle commits eines Branches

git log hnat --not main --abbrev-commit

zeigt Änderungen in hnat an,welche nicht in branch main sind

geänderte Dateien

um nur die geänderten Dateien aufzulisten:

git log --name-only --oneline

diff

git log BRANCH --abbrev-commit
git diff COMMIT1..COMMIT2 >changes.patch
git diff COMMIT^ COMMIT
#branch-übergreifend für einzelne Datei
git diff 4.14-main..4.9-main -- arch/arm/boot/dts/mt7623.dtsi

#Verzeichnis ausschließen:
git diff b543a94c2247bbf9e66ad9996f7d0273458faacd..bbbb5eb11e10e9fa4e0e3a620f8aa47e1e8355c4 -- . ':(exclude)drivers/misc/mediatek/*' >wifi.diff

commit

Änderungen anzeigen

git status

unversionierte Dateien hinzufügen

git add <Datei/Verzeichnis>

alles in Git übernehmen (-s=signieren)

git commit -as

nur bestimmte Teile

git commit <Datei/Verzeichnis>

letzten commit überarbeiten (sollte noch nicht gepusht sein)

git add <Datei>
git commit --amend
git commit --amend --author="Name <name@mail.com>" #Autor setzen

ältere commits ändern (noch nicht gepushed):

git rebase -i HEAD~X
# X ist ie Anzahl der Commits die man zurückgehen möchte alternativ <sha1>^ um bis zu einem bestimmten commit zurückzugehen
# in die entsprechende commit-zeile gehen und nur pick in reword ändern,
# wenn edit statt reword:
git commit --amend
# rebase abschließen:
git rebase --continue

Quelle

Datei aus staging entfernen

wenn versehentlich Datei/Verzeichnis via „git add –all“ hinzugefügt wurde (noch nicht committed)

git reset HEAD -- Datei

Datei aus vorherigen Commit entfernen

wenn schon committed (und noch nicht gepushed) wurde

git reset HEAD^ .gitignore
git commit --amend

tagging

git tag -a v4.14.10-1 -m "first stable kernel"
git tag v4.16-rc1
git push origin v4.16-rc1
git tag -l

push

den aktuellen Branch auf das/die remote-Repo

git push

alle Branches:

git push --all origin

erzwungen (um commits entfernt zu löschen/überschreiben)

git push --force

lokales Repo aktualisieren

git fetch
git merge --ff-only origin/master

oder

git pull

revert

Merge rückgängig machen

git revert -m 1 <merge commit hash>

rebase

https://www.ralfebert.de/git/rebase/

git rebase -i <commit>

History nach <commit> neu schreiben

git rebase -i <commit>^

schließt commit mit ein

commit splitten

im Rebase den jeweiligen commit mit e kennzeichnen statt pick

wenn bei dem commit angekommen:

git reset HEAD^

um alle Datei-Änderungen dieses Commits zurückzusetzen

sollen komplette Datei-Änderungen übernommen werden, einfach via „git add <datei>“ +commit

sollen nur bestimmte Patch-Bereiche übernommen werden mit „git add -i“ arbeiten

Branch

branch erzeugen

git checkout -b <branch>
git push --set-upstream origin <branch>

branch löschen

entfernter Branch:

git push origin --delete <branch>

lokal:

git branch -d <branch>

branches auflisten

git branch -vv

zeigt alle branches (lokal/remote) mit letztem commit und push-info (x commits hinterher/voraus)

Datei/Verzeichnis aus anderem Branch in aktuellen

git checkout otherbranch myfile.txt

commit aus anderen Branch

git cherry-pick sha_hash

um eine Art Squash-merge zu machen (2+ commits in einem zusammenfassen)

git cherry-pick -n erster_commit
git cherry-pick -n zweiter_commit
git commit -a

Konflikt-Markierung

https://stackoverflow.com/questions/7901864/git-conflict-markers

<<<<<<< HEAD:file.txt
Hello world #local
=======
Goodbye #remote
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt

pull-request in neuen Branch

Pullrequest #13 in neuen Branch unsquashed

git fetch origin pull/13/head:unsquashed
Von https://github.com/frank-w/BPI-R2-4.14
 * [neue Referenz]   refs/pull/13/head -> unsquashed

Branch umbenennen

git checkout unsquashed 
Zu Branch 'unsquashed' gewechselt
git branch -m main_unsquashed

Branch wechseln

git checkout branch

stash

https://git-scm.com/docs/git-stash/

„git stash“ legt Änderungen zur Seite, um trotzdem den Branch wechseln zu können

neben der quick&dirty-variante kann man auch via

git stash push -m "Beschreibung"

einen Name vergeben

#vorhandene Stashes anzeigen
git stash list
stash@{0}: WIP on gmac: e4f9258 added missing mt7623a-rfb-emmc.dts
stash@{1}: WIP on main: f5b5b75 decreasing debug-level of Wifi-driver
 
#Änderungen in einem Stash anzeigen
git stash show -p stash@{1}
diff --git a/.gitignore b/.gitignore
index d31ce3fa..19ca85c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,7 +42,7 @@ Module.symvers
 arch/arm/boot/zImage-dtb
 uImage
 *.rej
-
+u-boot/
 
#stash löschen
git stash drop stash@{1}
Gelöscht stash@{1} (15af1209b06ff52e3b4ed6cf898d0e394b2da67c)
 
#übernehmen des letzten Stashes in die Arbeitskopie
git stash apply
#apply + drop
git stash pop
 
#neuen branch (name=stashbranch) aus dem stash (originalposition) anlegen
git stash branch stashbranch stash@{0}

Mbox-Dateien

häufig liegen Patches/-Serien als Mbox-Datei (Email-Format) vor und diese lassen sich recht komfortabel mit git am importieren. Dabei werden Author und die Commit-Nachricht auch übernommen. Bei Serien wird für jede Mail ein einzelner Commit angelegt.

git am mbox.patch

interessant wird es, wenn ein Patch fehlschlägt. normalerweise bricht git dann ab und man muss den gesamten Patch der jeweiligen Mail manuell importieren. Ich behelfe mir mit der folgenden Vorgehensweise:

als erstes das Arbeitsverzeichnis sauber machen (git Status sollte keine Dateien/Verzeichnisse anzeigen)…am besten das Patchen in einem eigenen Branch durchführen.

#reject-parameter führt den Patch soweit wie möglich aus und man muss nur den Chunk manuell einpflegen, der fehlgeschlagen ist
git am --reject ~/Downloads/ubootv3_Add-U-Boot-support-for-MediaTek-SoCs---MT7623n-MT7629.patch

die Ausgabe sieht etwa so aus:

Patch include/dt-bindings/power/mt7623-power.h sauber angewendet
Wende an: arm: MediaTek: add basic support for MT7629 boards
Prüfe Patch arch/arm/Kconfig ...
error: bei der Suche nach:
          targeted at media players and tablet computers. We currently
          support the S905 (GXBaby) 64-bit SoC.

config ARCH_LPC32XX
        bool "NXP LPC32xx platform"
        select CPU_ARM926EJS

error: Anwendung des Patches fehlgeschlagen: arch/arm/Kconfig:658
Patch-Bereich #2 erfolgreich angewendet bei 1423 (-33 Zeilen versetzt)

hier sieht man, dass ein Patch in arch/arm/Kconfig fehlgeschlagen ist. Dabei wird eine rej-Datei mit gleichem Namen angelegt (wie beim normalen Patch, nur git sagt es nicht). In dieser Datei ist jetzt nur der Abschnitt (Chunk) der nicht eingebracht werden kann. Dieser muss jetzt manuell eingefügt werden und danach sollte rej-Datei gelöscht werden. Das wiederholen für jede Datei die nicht komplett gepatcht werden konnte.

sind alle Patches angewendet, müssen die Änderungen noch übernommen werden (in das staging) via „git add <datei/verzeichnis>“

zum Schluss wird „git am –continue“ aufgerufen um den aktuellen Commit abzuschließen und ggf. mit dem nächsten anzufangen

remote repos

am Beispiel, wie ich einen Branch für eine neue Kernel-Version anlege

git checkout 4.18-main
git reset --hard v4.18 #back to last mainline
git checkout -b 4.19-rc #create new branch for new kernel
git remote add torvalds https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch torvalds
git merge v4.19-rc1
git push --set-upstream origin 4.19-rc
#add additional files
git checkout 4.18-main build.sh
git checkout 4.18-main arch/arm/configs/mt7623n_evb_fwu_defconfig
git add build.sh arch/arm/configs/mt7623n_evb_fwu_defconfig
git commit
git push

mehrere Push-Repos

git remote set-url origin --push --add http://www.qnap.loc:7080/git/web_brk
git remote set-url origin --push --add http://www.pi.loc/git/web_brk

die git-config sieht nun so aus:

[remote "origin"]
        url = http://www.qnap.loc:7080/git/web_brk
        fetch = +refs/heads/*:refs/remotes/origin/*
        pushurl = http://www.pi.loc/git/web_brk
        pushurl = http://www.qnap.loc:7080/git/web_brk

hier muss man jetzt aufpassen, da in das ursprüngliche Repo (hinter url) nicht mehr gepusht wird…dieses muss ebenfalls als push-url vorhanden sein. Es ist dabei unerheblich, ob die .git/config angepasst wurde oder git remote verwendet wurde.

$ git remote -v
origin	http://www.qnap.loc:7080/git/web_brk (fetch)
origin	http://www.pi.loc/git/web_brk (push)
origin	http://www.qnap.loc:7080/git/web_brk (push)

Config

Benutzer/Email konfigurieren

git config --global user.name "Frank Wunderlich"
git config --global user.email @gmx.de

Editor ändern

falls für git nicht der standard-Editor verwendet werden soll

git config --global core.editor nano

Benutzername speichern

in .git/config die Zeile url unter „remote origin“ anpassen

[remote "origin"]
    url = https://frank-w@github.com/frank-w/u-boot.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Passwort-Cache

Anmeldedaten die nächsten 5 Minuten speichern

git config credential.helper 'cache --timeout=300'

Alias

  git config alias.co checkout

alternativ:

  nano .git/config
[alias]
    st = status
    co = checkout
    kver = "!f() { make kernelversion; };f"
    ckver = "!f() { git commit -a -m \"update to $(make kernelversion)\"; };f"

Farben

git config --global --add color.ui true

Github

Lighttpd

FIXME

aktuell gibt es bei größeren Repos (z.b. mein Kernel-repo) noch einen 400-error beim push…

Details

Details

error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 Bad Request
fatal: The remote end hung up unexpectedly

am Server:

(connections-glue.c.403) chunked data size too large -> 400

das ist ein Bug in lighttpd, welcher zwar gefixt, aber noch nicht in debian stretch integriert ist

https://redmine.lighttpd.net/issues/2854 (Zielversion:1.4.49)

lighttpd -v
lighttpd/1.4.45 (ssl) - a light and fast webserver
Build-Date: Jan 14 2017 21:07:19

evtl. auch https://redmine.lighttpd.net/boards/3/topics/6884

mit dem Lighttpd-Packet aus Buster (Nachfolger von Stretch) bricht der Transfer nicht ab, da dieses aber die libc mitzieht und man sich da leicht das ganze System zerlegt habe ich die aktuelle 1.4.51 kompiliert und in das Stretchpacket reingebastelt

Zum Anzeigen hier klicken ⇲

Zum Verstecken hier klicken ⇱

#die neue Version runterladen, kompilieren und als deb packen
#quellen in /etc/apt/sources.list nochmal als deb-src hinzufügen (vorhandene Zeilen kopieren und das -src ergänzen)
apt-get update
apt-get build-dep lighttpd
apt-get install wget checkinstall
wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.51.tar.gz -P /usr/local/src/
cd /usr/local/src/
sha256sum lighttpd-1.4.51.tar.gz #optional
tar -xf lighttpd-1.4.51.tar.gz
cd lighttpd-1.4.51
./configure --prefix=/usr --with-openssl --with-openssl-libs=/usr/lib/arm-linux-gnueabihf/  --with-webdav-props --with-webdav-locks
make
 
#lief das fehlerfrei durch per checkinstall ein Packet bauen, damit es nicht lokal installiert werden muss
checkinstall
#die Frage nach der Dokumentation mit n beantworten (wenn schon bestätigt wurde kann das Verzeichnis doc-pak gelöscht werden, dann wird man erneut gefragt)
 
  Should I create a default set of package docs?  [y]: n
 
#beim ersten Aufruf sollte noch eine Beschreibung eingegeben werden...
#diese wird hier aber nicht benötigt, da später nur das usr-Verzeichnis herauskopiert wird und
#der Rest (modifiziert) vom alten Packet verwendet wird.
#Ich habe einfach nur "lighttpd (1.4.51)" eingetragen und mit Strg+D beendet
 
#alles auf default lassen, da damit nur make install ins Packet reinläuft
 
#wenn fertig dann die deb nach /usr/local/src kopieren und wieder in das Verzeichnis zurückgehen
cp *.deb ../
cd ../
 
#originalpacket runterladen und entpacken
root@stretch-dev:/usr/local/src# wget http://ftp.de.debian.org/debian/pool/main/l/lighttpd/lighttpd_1.4.45-1_armhf.deb
#i386:http://ftp.de.debian.org/debian/pool/main/l/lighttpd/lighttpd_1.4.45-1_i386.deb
#amd64:http://ftp.de.debian.org/debian/pool/main/l/lighttpd/lighttpd_1.4.45-1_amd64.deb
root@stretch-dev:/usr/local/src# dpkg-deb -R lighttpd_1.4.45-1_armhf.deb lighttpd_1.4.51_test
root@stretch-dev:/usr/local/src# ls -l lighttpd_1.4.51_test
insgesamt 20
drwxr-xr-x 2 root root 4096 Jan 14  2017 DEBIAN
drwxr-xr-x 6 root root 4096 Jan 14  2017 etc
drwxr-xr-x 3 root root 4096 Jan 14  2017 lib
drwxr-xr-x 5 root root 4096 Jan 14  2017 usr
drwxr-xr-x 5 root root 4096 Jan 14  2017 var
#dort nun die Versionsnummer in der DEBIAN/control ändern
#Version: 1.4.51-1
#da auch php5-cgi nicht mehr existiert habe ich das auch angepasst (auf php-cgi)
 
#das neue Packet entpacken wir jetzt und kopieren den inhalt über das alte
dpkg-deb -R lighttpd_1.4.51-1_armhf.deb lighttpd_1.4.51_unpack
cp -r lighttpd_1.4.51_unpack/usr/* lighttpd_1.4.51_test/usr/
#zum Schluss wieder packen
dpkg-deb -b lighttpd_1.4.51_test lighttpd_1.4.51-2_armhf.deb

lighttpd_1.4.51-2_armhf.deb lighttpd_1.4.51-2_amd64.deb

repo anlegen:

mkdir reponame
cd reponame
git init --bare
chown -R www-data:frank .
#chmod -R g+w .

in der config des server-repo nicht vergessen:

[http]
        receivepack = true

ggf. postreceive-hook für automatisches checkout: post-receive.txt (ohne .txt, ausführbar im Ordner hooks des server-repos)

/etc/lighttpd/conf-available/11-git.conf

#https://git-scm.com/docs/git-http-backend
server.modules += (
  "mod_cgi",
#  "mod_alias",
#  "mod_auth",
  "mod_setenv")

alias.url += ( "/git" => "/usr/lib/git-core/git-http-backend" )
$HTTP["url"] =~ "^/git" {
        cgi.assign = ("" => "")
        setenv.add-environment = (
                "GIT_PROJECT_ROOT" => "/mnt/vcs/git",
                "GIT_HTTP_EXPORT_ALL" => "1"
        )
}

#anonymous read+auth write
#$HTTP["querystring"] =~ "service=git-receive-pack" {
#       include "git-auth.conf"
#}
#$HTTP["url"] =~ "^/git/.*/git-receive-pack$" {
#       include "git-auth.conf"
#}

#auth read+write
$HTTP["url"] =~ "^/git/private" {
        include "git-auth.conf"
}

die git-auth.conf muss noch angelegt werden (hier ohne Funktion = unbeschränkter Zugriff):

/etc/lighttpd/git-auth.conf

#auth.require = (
#        "/" => (
#                "method" => "basic",
#                "realm" => "Git Access",
#                "require" => "valid-user"
#               )
#)

#auth backend definieren
lighty-enable-mod git

zum Schluss noch den Webservice neustarten

service lighttpd restart

nun kann man mit folgenden Befehl ein vorhandenes Repo auf den Server spiegeln:

git push --mirror http://server/git/kernel

ggf. danach bei dem Repo das neue remote-repo hinzufügen

sollte nach dem Upgrade von 1.4.45 auf eine höhere Version trotz gleicher Konfig das Repo nicht mehr gefunden werden ist vermutlich in der git-config für lighttpd „GIT_HTTP_EXPORT_ALL“ nicht auf „1“ sondern „“ (auch of zu finden), siehe https://stackoverflow.com/questions/52891023/lighttpd-git-http-backend-setenv-issue

bricht git mit folgender Meldung ab:

error: RPC failed; HTTP 411 curl 22 The requested URL returned error: 411 Length Required

sollte man den post-Puffer einstellen:

git config http.postBuffer 524288000
#oder global
git config --global http.postBuffer 524288000

webbasierte Git-Tools

GITList

lighttpd

ich habe gitlist im document_root entpackt mit name glist (damit es nicht mit /git kollidiert)

in der /etc/lighttpd/lighttpd.conf muss dann folgendes hinzugefügt werden, damit es funktioniert

url.rewrite-once = (
    "^/glist/themes/.+" => "$0",
    "^/glist/favicon\.ico$" => "$0",
    "^/glist(/[^\?]*)(\?.*)?" => "/glist/index.php$1$2"
)

gefolgt von einem

service lighttpd restart

default-branch setzen

git symbolic-ref HEAD refs/heads/branch

Beschreibung

die Datei „description“ in jedem Repo-Ordner bearbeiten

Gitweb

git-php

Diskussion

programming/git/start.txt · Zuletzt geändert: 2018/12/06 20:52 von frank