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:18]
frank [commit splitten]
programming:git:start [2020/02/14 17:35] (aktuell)
frank [umbenannte Dateien]
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 185: Zeile 234:
  
 (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 260: Zeile 314:
  
 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>​
 +
 +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.packedGitWindowSize 128
 +
 +in der gitconfig sieht das dann so aus:
 +
 +  [core]
 +    packedGitLimit = 128m
 +    packedGitWindowSize = 128
  
 ===== whitespace-fix ===== ===== whitespace-fix =====
Zeile 270: Zeile 367:
   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 394:
 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 431: Zeile 534:
 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. 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>"​+sind alle Patches angewendet, müssen die Änderungen noch übernommen werden (in das staging) via "git add <​verzeichnis/datei>"
  
 zum Schluss wird "git am --continue"​ aufgerufen um den aktuellen Commit abzuschließen und ggf. mit dem nächsten anzufangen zum Schluss wird "git am --continue"​ aufgerufen um den aktuellen Commit abzuschließen und ggf. mit dem nächsten anzufangen
Zeile 454: Zeile 557:
 </​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 596:
  
 ===== 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 613:
 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 660:
  
   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 689:
     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}
 </​code>​ </​code>​
  
Zeile 564: Zeile 706:
    ​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.1557940689.txt.gz · Zuletzt geändert: 2019/05/15 19:18 von frank