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/05/15 19:20]
frank [Mbox-Dateien]
programming:git:start [2020/06/01 11:41] (aktuell)
frank [lokales Repo aktualisieren]
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 156: Zeile 195:
  
 <​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 232:
  
   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 242: Zeile 298:
 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 316:
  
 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 380:
   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 407:
 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 454: Zeile 570:
 </​code>​ </​code>​
  
 +==== fremdes repo einbinden und branches nutzen ====
 +
 +<​code>​
 +git remote add vdorst https://​github.com/​vDorst/​linux-1.git
 +git fetch --all
 +git log --oneline vdorst/​5.0-phy
 +git checkout vdorst/​5.0-phy #​losgelöster head, da branch lokal noch nicht existiert
 +git checkout -b 5.0-phy #branch lokal anlegen
 +git push --set-upstream origin 5.0-phy #ins eigene remote-repo pushen
 +</​code>​
 ==== mehrere Push-Repos ==== ==== mehrere Push-Repos ====
  
Zeile 483: Zeile 609:
  
 ===== 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 496: Zeile 626:
 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 531: Zeile 673:
  
   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 549: Zeile 702:
     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 564: Zeile 724:
    ​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 ======
programming/git/start.1557940811.txt.gz · Zuletzt geändert: 2019/05/15 19:20 von frank