Benutzer-Werkzeuge

Webseiten-Werkzeuge



programming:git:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
programming:git:start [2019/06/19 09:36]
frank [remote repos]
programming:git:start [2020/09/12 14:16] (aktuell)
frank [rebase als merge]
Zeile 7: Zeile 7:
 <code> <code>
 git clone --depth 1 https://github.com/frank-w/BPI-R2-4.14 git clone --depth 1 https://github.com/frank-w/BPI-R2-4.14
-git remote set-branches origin '*' 
-git fetch --depth 1 
 </code> </code>
  
Zeile 14: Zeile 12:
  
 <code> <code>
-git clone --depth=50 --single-branch --branch v5.1-next-mt7621-phylink https://github.com/vDorst/linux-1.git mt76xx-phylink+git clone --depth --single-branch --branch 5.4-main https://github.com/frank-w/BPI-R2-4.14 5.4-main
 </code> </code>
 +
 +mit "--single-branch" werden nur Informationen zum gewählten branch heruntergeladen
 +
 +  $ git branch -a
 +  * 5.4-main
 +    remotes/origin/5.4-main
 +
 +möchte man trotzdem alle branchinformationen haben nimmt man stattdessen "--no-single-branch", dadurch ist aber der Download größer (depth x anzahl_branches)
 +
 +hat man nur die Sparvariante und möchte später wieder auf die anderen branches zugreifen:
 +
 +  git remote set-branches origin '*'
 +  git fetch --depth 1
 ===== log ===== ===== log =====
  
Zeile 63: Zeile 74:
   git remote   git remote
  
 +==== eigenes Format ====
 +
 +  git log --pretty=format:'%C(Yellow)%h %C(Green)%ad %C(reset)%s %C(Cyan)(%an)' --date=short
 +
 +==== inklusive patch ====
 +
 +  git log --oneline -p
 +==== merges ====
 +
 +zuerst merge-commit ermitteln, z.B. so:
 +
 +  git log --merges
 +
 +danach kann man mit diesen Commit-Hash ermitteln, welche commits dran hängen
 +
 +  git log --no-merges --oneline <hash>^..<hash>
 +
 +Beispiel als alias:
 +
 +  logm = !git log --no-merges --oneline $1^..$1
 +
 +will man nur die Datei-Änderungen des kompletten merges sehen, kann man das so:
 +
 +  git show -m <hash>
 ===== diff ===== ===== diff =====
  
Zeile 73: Zeile 108:
 #Verzeichnis ausschließen: #Verzeichnis ausschließen:
 git diff b543a94c2247bbf9e66ad9996f7d0273458faacd..bbbb5eb11e10e9fa4e0e3a620f8aa47e1e8355c4 -- . ':(exclude)drivers/misc/mediatek/*' >wifi.diff git diff b543a94c2247bbf9e66ad9996f7d0273458faacd..bbbb5eb11e10e9fa4e0e3a620f8aa47e1e8355c4 -- . ':(exclude)drivers/misc/mediatek/*' >wifi.diff
 +
 +#mit remote vergleichen
 +branch=$(git rev-parse --abbrev-ref HEAD)
 +git diff $branch origin/$branch
 </code> </code>
  
Zeile 89: Zeile 128:
 </code> </code>
  
 +==== merge-commits ====
 +
 +  git show -m 34183ddd13db
 +
 +zeigt alle Änderungen durch den merge, nicht nur die Änderungen, die aus Konflikten entstanden sind
 ==== bestimmte Version einer Datei ==== ==== bestimmte Version einer Datei ====
  
Zeile 102: Zeile 146:
   git show <treeish>:path/to/$file > /tmp/$file   git show <treeish>:path/to/$file > /tmp/$file
   gedit /tmp/$file   gedit /tmp/$file
 +  
 +auch committer-info zeigen
 +
 +  git show --format=fuller HEAD
 ===== commit ===== ===== commit =====
  
Zeile 156: Zeile 204:
  
 <code>git tag -l</code> <code>git tag -l</code>
 +
 +===== lokale Änderungen ignorieren =====
 +
 +soll eine Datei im remote-repo nicht mehr auf Änderungen überwacht werden:
 +
 +  git update-index --assume-unchanged [<file> ...]
 +
 +tracking wieder aktivieren:
 +
 +  git update-index --no-assume-unchanged [<file> ...]
  
 ===== push ===== ===== push =====
Zeile 183: Zeile 241:
  
   git rebase --preserve-merges v4.20-rc7   git rebase --preserve-merges v4.20-rc7
 +  #neueres git (Ubuntu 20.4)
 +  git rebase --rebase-merges v5.7
  
 (holt die Änderungen vom remote und rebased die eigenen "on-top") (holt die Änderungen vom remote und rebased die eigenen "on-top")
 +
 +alternative (aktuellen branch im losgelösten Head aktualisieren):
 +
 +  git rebase --onto v5.3-rc1 <erster commit>^ <letzter commit>
 +  git checkout -b <neuer branch>
  
 oder (remote mit lokal mergen inkl. merge-commit) oder (remote mit lokal mergen inkl. merge-commit)
Zeile 198: Zeile 263:
  
 https://shinglyu.github.io/web/2018/03/25/merge-pull-requests-without-merge-commits.html https://shinglyu.github.io/web/2018/03/25/merge-pull-requests-without-merge-commits.html
 +
 +möchte man immer einen merge-commit, auch wenn dieser per default nicht angelegt wird:
 +
 +  git merge --no-ff new-feature
 ===== revert ===== ===== revert =====
  
Zeile 220: Zeile 289:
   git push --force-with-lease   git push --force-with-lease
  
 +==== rebase als merge ====
 +
 +  git checkout fix_types
 +  git rebase master
 +  git checkout master
 +  git merge fix_typos --ff-only
 +
 +https://coderefinery.org/blog/2020/04/24/rebase-vs-merge/
 +
 +als git alias (~/.gitconfig):
 +
 +  rebasefeature = "!f() { CUR=$(git rev-parse --abbrev-ref HEAD);FEAT=$1;echo $CUR $FEAT; git checkout $FEAT; git rebase $CUR; git checkout $CUR; git merge $FEAT --ff-only; }; f"
 ==== datei entfernen ==== ==== datei entfernen ====
  
Zeile 242: Zeile 323:
 um alle Datei-Änderungen dieses Commits zurückzusetzen um alle Datei-Änderungen dieses Commits zurückzusetzen
  
-sollen komplette Datei-Änderungen übernommen werden, einfach via "git add <datei>" +commit+sollen komplette Datei-Änderungen übernommen werden, einfach via "git commit <datei>" ("-c ORIG_HEAD" übernimmt die Beschreibung des ursprünglichen zu splittenden Commit)
  
-sollen nur bestimmte Patch-Bereiche übernommen werden mit "git add -p" arbeiten+sollen nur bestimmte Patch-Bereiche übernommen werden mit "git add -p" arbeiten +commit
  
 ==== Basis aktualisieren ==== ==== Basis aktualisieren ====
Zeile 260: Zeile 341:
  
 falls das mit Fehler abbricht (out of memory): falls das mit Fehler abbricht (out of memory):
 +
 +  fatal: Out of memory, realloc failed
 +  error: failed to run repack
  
 https://stackoverflow.com/questions/4826639/repack-of-git-repository-fails https://stackoverflow.com/questions/4826639/repack-of-git-repository-fails
  
 +  * neues ServerRepo anlegen (git init --bare)
 +  * git-config erweitern
 +
 +<code>
 +[http]
 +        receivepack = true
 +[pack]
 +        windowMemory = 16m
 +        packSizeLimit = 56m
 +        deltaCacheSize = 1
 +        threads = 1
 +</code>
 +
 +  * ggf. "git repack -a -d", dafür habe ich ein alias definiert<code>
 +cleanup = "!f() { git reflog expire --expire=now --all; git gc --aggressive --prune=now;git repack -a -d; }; f"</code>
 +  * via scp die neu gepackten (auf kleine chunks) auf den Server kopieren
 +
 +<code>
 +scp .git/objects/pack/* $server:/$pfad/$repo/objects/pack/
 +scp -r .git/packed-refs $server:/$pfad/$repo/
 +</code>
 +
 +  * Rechte auf dem Server anpassen (chmod -R user:group .;chmod -R g+w .)
 +  * jetzt erst den push durchführen (ggf. mit ssh)
 +
 +<code>
 +git push --mirror ssh://$server/$pfad/$repo
 +</code>
 +
 +  git config --global core.packedGitLimit 128m
 +  git config --global core.packedGitWindowSize 128
 +
 +in der gitconfig sieht das dann so aus:
 +
 +  [core]
 +    packedGitLimit = 128m
 +    packedGitWindowSize = 128
 +
 +nachdem ich irgendwann weiterhin out-of-memory Fehler bekommen hatte inklusive oom-reaper (Prozess gekillt wegen zu wenig Speicher) konnte ich das Problem mit einem zusätzlichen SWAP-Speicher (auf ssd) lösen
 +
 +<code>
 +swapfile=/var/swap.img
 +if [[ ! -e $swapfile ]];then
 +  dd if=/dev/zero of=$swapfile bs=1M count=4096
 +fi
 +chmod 0600 $swapfile
 +mkswap $swapfile
 +swapon $swapfile
 +</code>
 +
 +Quelle: https://stackoverflow.com/a/54755601
 ===== whitespace-fix ===== ===== whitespace-fix =====
  
Zeile 270: Zeile 405:
   git checkout -b branch-ws   git checkout -b branch-ws
   git am --whitespace=fix *.patch   git am --whitespace=fix *.patch
-  + 
 +===== debugging ===== 
 +==== bisect ==== 
 +* https://stackoverflow.com/questions/3179498/how-can-i-cut-down-a-git-bisect-run-using-file-paths
 ===== Branch ===== ===== Branch =====
  
Zeile 294: Zeile 432:
 zeigt alle branches (lokal/remote) mit letztem commit und push-info (x commits hinterher/voraus) zeigt alle branches (lokal/remote) mit letztem commit und push-info (x commits hinterher/voraus)
  
 +==== Branches mit bestimmten commit finden ====
 +
 +  git branch --contains <commit-id>
 ==== remote branches aktualisieren ==== ==== remote branches aktualisieren ====
  
Zeile 299: Zeile 440:
  
 löscht alle Referenzen auf remote-branches, welche nicht mehr existieren löscht alle Referenzen auf remote-branches, welche nicht mehr existieren
 +
 +==== remote branch sichern ====
 +
 +bevor ein entfernter branch überschrieben / gelöscht wird, kann man ihn so in einen anderen branch (lokal) sichern
 +
 +  git checkout -b 5.8-rc-old origin/5.8-rc
 +  git branch --unset-upstream
 ==== Datei/Verzeichnis aus anderem Branch in aktuellen ==== ==== Datei/Verzeichnis aus anderem Branch in aktuellen ====
  
Zeile 488: Zeile 636:
 ===== git format-patch ===== ===== git format-patch =====
  
-  git format-patch sha1_from^..sha1_to --cover-letter+  git format-patch -vX sha1_from^..sha1_to --cover-letter
  
 in 0000-cover-letter.patch wird dann die Beschreibung der Patch-Serie reingeschrieben in 0000-cover-letter.patch wird dann die Beschreibung der Patch-Serie reingeschrieben
  
 +  git format-patch sha1_from^..sha1_to --subject-prefix="RESEND PATCH v2" --to="email" --cc="other email"
 ===== git send-email ===== ===== git send-email =====
 +
 +  sudo apt-get install git-email
  
 https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/ https://www.freedesktop.org/wiki/Software/PulseAudio/HowToUseGitSendEmail/
 +
 +die History (changes since vX) unter die Signed-off-by mit --- getrennt
  
 patch erzeugen (Version X von sha1 bis sha2 mit Erzeugung des Patch#0): patch erzeugen (Version X von sha1 bis sha2 mit Erzeugung des Patch#0):
Zeile 506: Zeile 659:
 Empfänger ermitteln: Empfänger ermitteln:
  
-  scripts/get_maintainer.pl --norolestats 0001-net-dsa-adding-fields-for-holding-information-about-.patch +  scripts/get_maintainer.pl --norolestats *.patch  
 +  scripts/get_maintainer.pl v6-00{01..13}*.patch|sort -u
  
-und dann senden:+hier die committer rausnehmen und in den coverletter eintragen (1 mailingliste als To und die anderen als CC)
  
-  git send-email 0000-cover-letter.patch 000{1..8}-net-*.patch+  To: linux-mediatek@lists.infradead.org 
 +  Cc: devicetree@vger.kernel.org, 
 +      linux-arm-kernel@lists.infradead.org, 
 +      ... 
 + 
 +und senden 
 + 
 +  git send-email --to-cover --cc-cover v6-*.patch
  
 http://nickdesaulniers.github.io/blog/2017/05/16/submitting-your-first-patch-to-the-linux-kernel-and-responding-to-feedback/ http://nickdesaulniers.github.io/blog/2017/05/16/submitting-your-first-patch-to-the-linux-kernel-and-responding-to-feedback/
 +
 +falls man jemanden vergessen hat, kann man die serie nochmal so schicken (vorher im coverletter die Mailadressen entfernen und ggf. auf das Nachsenden hinweisen):
 +
 +  git send-email --to=linux-arm-kernel@lists.infradead.org --suppress-cc=all v6-*.patch
 ===== Config ===== ===== Config =====
 ==== Benutzer/Email konfigurieren ==== ==== Benutzer/Email konfigurieren ====
Zeile 541: Zeile 706:
  
   git config credential.helper 'cache --timeout=300'   git config credential.helper 'cache --timeout=300'
 +  
 +=== windows ===
 +
 +zurücksetzen von BN/PW:
 +
 +  rundll32.exe keymgr.dll, KRShowKeyMgr
 +
 +ggf. manager neu setzen (falls openssh-dialog kommt)
 +
 +  git config --global credential.helper manager
 +
 ==== Alias ==== ==== Alias ====
     git config alias.co checkout     git config alias.co checkout
Zeile 559: Zeile 735:
     kver = "!f() { make kernelversion; };f"     kver = "!f() { make kernelversion; };f"
     ckver = "!f() { git commit -a -m \"update to $(make kernelversion)\"; };f"     ckver = "!f() { git commit -a -m \"update to $(make kernelversion)\"; };f"
 +    current = rev-parse --abbrev-ref HEAD
 +    remote-diff = !git diff $1@{upstream}..$1@{0}
 +    nextref = "!f() { git log --reverse --ancestry-path --pretty=%H $1..HEAD | head -${2:-1} | tail -1; }; f"
 +    cleanup = "!f() { git reflog expire --expire=now --all; git gc --aggressive --prune=now;git repack -a -d; }; f"
 +    logone = !git log --oneline
 +    logm = !git log --no-merges --oneline $1^..$1 #commits, welche zu einem merge-commit gehören
 +    pushnew = "!git push origin $(git rev-parse --abbrev-ref HEAD);"
 </code> </code>
  
Zeile 574: Zeile 757:
    renames = copies    renames = copies
    renamelimit = 0    renamelimit = 0
 +</code>
 +
 +==== bash-Integration ====
 +
 +in ~/.bashrc das vorhandene PS1 anpassen:
 +
 +<code>
 +parseGitBranch() {
 +    git rev-parse --abbrev-ref HEAD 2> /dev/null | sed -e 's/\(.*\)/(\1)/'
 +}
 +
 +if [ "$color_prompt" = yes ]; then
 +    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\] $(parseGitBranch)\n\$ '
 +else
 +    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $(parseGitBranch)\n\$ '
 +fi
 </code> </code>
 ====== Github ====== ====== Github ======
Zeile 792: Zeile 991:
 !external/ !external/
 </code> </code>
 +
 +==== automatisches build ====
 +
 +ich habe auf meinem NAS ein (sehr simples) deployment eingerichtet, welches mir nach einem Push automatisch mein [[https://github.com/frank-w/BPI-R2-4.14|Kernel-repo]] baut.
 +
 +dazu muss ich natürlich erstmal die Abhängigkeiten installieren, die meine build.sh benötigt (siehe Readme.md).
 +weiterhin benötigt ccache ein temp-Verzeichnis im home des Users unter dem die build.sh läuft...da dies bei mir www-data ist (home=/var/www) musste ich das Verzeichnis hier anlegen und entsprechend die Rechte setzen.
 +
 +Bei mir läuft der GIT-Server in einer VM, von daher bedenkenlos möglich ;) sonst sollte zumindest der Deploy-Prozess (und die installierten Tools) in eine VM gepackt werden.
 +
 +der git-hook selbst sieht dann so aus (da ich nicht nur den Master-Branch bauen möchte sind die Code-Stellen auskommentiert):
 +<code bash>
 +#!/bin/bash
 +TARGET="/mnt/vcs/git_repo/BPI-R2-Linux-master"
 +GIT_DIR="/mnt/vcs/git_repo/BPI-R2-Linux"
 +BRANCH="master"
 +
 +while read oldrev newrev ref
 +do
 +  # only checking out the master (or whatever branch you would like to deploy)
 +#  if [[ $ref = refs/heads/$BRANCH ]];
 +#  then
 +     BRNCH=${ref//refs\/heads\//} #without "A" to avoid conflict with filter
 +    echo "Ref $ref ($oldrev => $newrev) received. Deploying
 +${BRNCH} branch to production..."
 +    mkdir -p $TARGET/$newrev
 +    git --work-tree=$TARGET/$newrev --git-dir=$GIT_DIR check
 +out -f $BRNCH
 +    echo "starting deploy..."
 +    (
 +      echo "deploy it..."
 +      cd $TARGET/$newrev
 +      ./build.sh importconfig
 +      ./build.sh build
 +      ./build.sh pack
 +      #...
 +    ) &> $TARGET/$newrev/deploy.log &
 +#  else
 +#    echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
 +#  fi
 +done
 +</code>
 +
 +die Befehle zum kompilieren ließen sich natürlich in eine separate Datei auslagern, die im Git selbst liegt...auch die Bedingung, welche Branches gebaut werden sollen...ich wollte es aber einfach halten ;)
 +
 +das wichtigste, was fehlt ist eine Warteschlange, falls der build-prozess noch läuft. hier kann man sich entweder über eine run-datei helfen oder man schaut, ob der langlaufende Prozess noch läuft
 +
 +  if [[ "$(pidof make)" != "" ]]; then echo "build running"; fi
 +  if [[ "$(pidof tar)" != "" ]]; then echo "pack running"; fi
 +
 +für beide Fälle müsste der build-Prozess geparkt werden
 ====== webbasierte Git-Tools ====== ====== webbasierte Git-Tools ======
 ===== GITList ===== ===== GITList =====
programming/git/start.1560929782.txt.gz · Zuletzt geändert: 2020/08/29 17:14 (Externe Bearbeitung)