git,

vers l’infini et au-delà!

Qui suis-je?

Grummfy

Jonathan Van Belle

@Grummfy

@Grummfy@mamot.fr

me@grummfy.be

github.com/grummfy

 

Contributeur open source : atoum, hoa, ...

Plan

  • git
  • git alias
  • git extension
  • Création d'extension
  • Trucs & astuces

git

  • DCVS
  • Le plus utilisé des CVS
  • Ecosystème conséquent

git : opération courante

  • commit
  • merge
  • push
  • pull
  • log
  • fetch
  • rebase
  • stash

git : config

  • set
    • git config --local user.name "grummfy"
    • git config user.name "grummfy"
  • get
    • git config --show-origin --get-all user.name
    • git config --local --get user.name
    • git config --global --get user.name
  • ​fichier
    • ​~/.gitconfig
    • .git/config

git : alias

  • ~ bash alias
  • relativement simple
  • a priori pas de paramètre ou de chaînage
[alias]
  st = status
  who = shortlog -sne
  co = checkout
  coma = commit -am
  pu = push
  undo = reset --soft HEAD^
  oneline = log --pretty=oneline --abbrev-commit --graph --decorate

git : alias avancé

  • utilisé la force de bash ;)
[alias]
  oneline = log --pretty=oneline --abbrev-commit --graph --decorate
  lc = !git oneline ORIG_HEAD.. --stat --no-merges # change since last pull

  addm = !git-ls-files -m -z | xargs -0 git-add # add modified files
  addu = !git-ls-files -o --exclude-standard -z | xargs -0 git-add  # add unknown files

  rem-extra = "!yolo() { git remote add $1 https://github.com/$2.git; }; yolo"

git alias : have fun

git extension

  • extension, plugins, sous commande, ...?
  • pas de documentation
  • facile à mettre en place
  • ⚠ concerne git ⇒ pas jgit, ngit, ...

git extension - flow

  • bien documenté
  • aide pour suivre un workflow git
  • git flow <command>
  • manipuler des branches, tag, merge, pull, push
  • bash script

git extension - subtree

  • extension ↦ intégré
  • alternative aux "submodules"
  • plusieurs repository dans un seul
  • git subtree <command>
  • bash script

git extension

  • But
    • Automatiser
    • Uniformiser
    • Simplifier
  • Code simple
  • bash embarqué sous windows ;)
  • ⚠ sécurité

Extension "homemade"

  • But identique
    • Automatiser
    • Uniformiser
    • Simplifier
  • Contexte
    • workflow
    • configuration
    • hook
    • opérations complexes

git author

  • échanger entre des profiles git
    • ​email
    • username
    • signature
  • git >= 2.13  configuration par dossier
  • un alias pourrait suffire
[alias]
  author-pro = !exec git config --local user.name "jvb" && \
    git config --local user.email "jvb@company.be"
  author-perso = !exec git config --local user.name "Grummfy" && \
    git config --local user.email "me@grummfy.be"

git deploy

  • lance les tests
    • make test
    • phing test
    • ...
  • ajout d'un tag
  • push le tag, un repository précis, une branche

git project

  • initialiser
    • configuration git
    • git submodule
    • composer
    • git hook
  • création de fichier
    • license
    • readme

git <company>

  • même idée que projet
    • framework
    • docker
    • configuration du server de CI
  • question-réponse sur un client/project

Trucs & astuces

  • Prévoir
    • autocomplétion
    • -h|--help
    • cas d'erreur ;)
  • git alias
  • bash alias
  • executable
  • KISS

Création

  • création d'un exécutable
    • script
    • chmod +x
    • commence par "git-"
  • dans un dossier du $PATH

Création : bash-completion

_MyAutocomplete ()
{
  local cur prev words cword
    _init_completion || return

  case "$cur" in
    -*)
      COMPREPLY=( $( compgen -W '--help -h -v' -- $cur ) );;
  esac

  return 0
}

complete -F _MyAutocomplete supercommande

complete -C monScriptDautocomplete.php supercommande

bash-completion & git

# see /usr/share/bash-completion/completions/git
_git_author ()
{
	case "$cur" in
	*)
		__gitcomp "perso pro"
		return
		;;
	esac
}

peut casser avec l'évolution de git

# ~.bashrc
source /chemin/vers/fichier/de/completion

Création : autocompletion

<?php

function animal($word) {
  return ['elephant', 'elephpant']; 
}

readline_completion_function('animal');
$reponse = readline('Quel est ton animal favoris? : ');

echo ((trim($reponse) == 'elephpant') ? 'Bravo' : 'bouuuuhhh') . PHP_EOL;

Question / Réponse

Création : $PATH

  • unix style (linux, *bsd, ...)
    • ~/bin
    • /usr/local/bin ?
  • windows
    • %GIT_HOME% ?
    • %PATH% ?

Création : git-auteur

#!/usr/bin/php
<?php

function switchConfig(string $user, string $email, string $sign) {
	passthru('git config --local user.name "' . $user . '"');
	passthru('git config --local user.email "' . $email . '"');
	passthru('git config --local user.signingkey "' . $sign . '"');
}

function help() { echo 'you ned help, too bad!', PHP_EOL; }

switch (@$argv[1]) {
        case 'perso': switchConfig('Grummfy', 'me@grummfy.be', 'AAAEEEVV'); break;
	case 'pro': switchConfig('jvb', 'jvb@company.tld', 'VVAAAEEE'); break;
	default: help(); break;
}

alias || extension

  • simple
  • peu de logique
  • pas de configuration
  • plutôt local
  • complexe a partagé
  • ± complexe
  • logique
  • configuration
  • dans votre langage de dev
  • facile a distribuer

⚠ git est un DCVS pas un task runner...

Questions?

commentaires ⇒

les slides y seront aussi ;)

Made with Slides.com