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/07/23 19:25]
frank [lokales Repo aktualisieren]
programming:git:start [2020/07/11 15:46] (aktuell)
frank [show]
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 156: Zeile 200:
  
 <​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 237:
  
   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"​)
Zeile 203: Zeile 259:
  
 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 247: Zeile 307:
 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 271: Zeile 331:
 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) +  * neues ServerRepo anlegen (git init --bare) 
-git-config erweitern+  ​* ​git-config erweitern 
 <​code>​ <​code>​
 [http] [http]
Zeile 282: Zeile 343:
         threads = 1         threads = 1
 </​code>​ </​code>​
-- via scp die neu gepackten (auf kleine chunks) auf den Server kopieren + 
-<​code>​scp .git/​objects/​pack/​* $server:/​$pfad/​$repo/​objects/​pack/​+  * 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 .git/​objects/​pack/​* $server:/​$pfad/​$repo/​objects/​pack/​
 scp -r .git/​packed-refs $server:/​$pfad/​$repo/​ scp -r .git/​packed-refs $server:/​$pfad/​$repo/​
-<​code>​ +</code> 
-Rechte auf dem Server anpassen (chmod -R user:group .;chmod -R g+w .) + 
-jetzt erst den push durchführen (ggf. mit ssh)+  * Rechte auf dem Server anpassen (chmod -R user:group .;chmod -R g+w .) 
 +  ​* ​jetzt erst den push durchführen (ggf. mit ssh) 
 <​code>​ <​code>​
 git push --mirror ssh://​$server/​$pfad/​$repo git push --mirror ssh://​$server/​$pfad/​$repo
 </​code>​ </​code>​
- 
-da der Fehler bei mir aber wiederkam (auch trotz großem swapfile), konnte ich ihn mit folgenden Kommandos beheben (als user,der das git gc aufruft): 
  
   git config --global core.packedGitLimit 128m   git config --global core.packedGitLimit 128m
Zeile 304: Zeile 369:
     packedGitWindowSize = 128     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 311: Zeile 389:
   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 335: Zeile 416:
 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 340: Zeile 424:
  
 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 534: Zeile 625:
  
 ===== 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 547: Zeile 642:
 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 582: Zeile 689:
  
   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 600: Zeile 718:
     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 615: Zeile 740:
    ​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 833: Zeile 974:
 !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.1563902702.txt.gz · Zuletzt geändert: 2019/07/23 19:25 von frank