Skip to Content
ConfigDotfiles

Dotfiles — Guide pratique

.bashrc, .zshrc, .gitconfig, .gitignore global — tout ce que tu configures sur chaque machine, condensé.

Une méthode propre consiste à ranger tous ses dotfiles dans un dépôt privé (~/.dotfiles/) et à utiliser des liens symboliques vers ~. Ça simplifie le clonage sur une nouvelle machine et les mises à jour cross-plateforme.

Structure recommandée

~/.dotfiles/ ├── .bashrc ├── .bash_profile ├── .zshrc ├── .gitconfig ├── .gitignore_global └── setup.sh

Installer les liens symboliques depuis le dépôt :

# Créer le dépôt de dotfiles dans un sous-répertoire mkdir -p ~/.dotfiles && cd ~/.dotfiles git init && git pull origin main # Script de linking (à lancer à chaque setup) for f in .bashrc .zshrc .gitconfig .gitignore_global; do if [ -e ~/$f ] || [ -L ~/$f ]; then mv ~/$f ~/$f.bak fi ln -s "$(pwd)/$f" ~/$f done

Le .bak en cas d’existence prévient la perte de config perso locale. Adapter selon ta philosophie : préférer un backup automatique ou écraser sans façon.

Bash — .bashrc et .bash_profile

.bashrc — Aliases courants

# Alias utilitaires alias ll='ls -lah --color=auto' alias la='ls -A --color=auto' alias ..='cd ..' alias ...='cd ../..' alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Alias Git raccourcis alias gs='git status -sb' alias gd='git diff --color=always' alias gcmsg='git commit -m' alias gco='git checkout' alias gb='git branch' alias glog='git log --oneline --graph --color=always' # Alias Docker alias dc='docker compose' alias dcl='docker compose logs -f' alias dcr='docker compose restart' alias dcd='docker compose down' alias dcp='docker compose pull && docker compose up -d' # Alias de développement alias s='npm start' alias b='npm run build' alias t='npm test'

.bash_profile — Environnement

# Charger le .bashrc pour les shells interactifs non-login if [ -f ~/.bashrc ]; then source ~/.bashrc fi # Variables d'environnement courantes export EDITOR="vim" export VISUAL="vim" export LANG="fr_FR.UTF-8" export LC_ALL="fr_FR.UTF-8" export PAGER="less -R" # Path perso export PATH="$HOME/.local/bin:$HOME/bin:$PATH" # Version Node via nvm (si installé) if [ -f "$HOME/.nvm/nvm.sh" ]; then . "$HOME/.nvm/nvm.sh" fi

Prompt personnalisé

# Affiche le répertoire courant + la branche git si dans un repo parse_git_branch() { git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1) /' } export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '

Les couleurs dans PS1 utilisent \[\033[...]m\] avec les \[ et \] non imprimables autour, sinon le terminal fait des calculs de longueur erronés et le prompt se décale à l’écrasement de ligne.

Zsh — .zshrc

Installation des plugins

# ZSH Automatique (gestion des plugins/thèmes) if [[ ! -f "${HOME}/.oh-my-zsh/oh-my-zsh.sh" ]]; then sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended fi # Plugins — à ajouter dans la variable `plugins=()` en bas du fichier plugins=(git z docker compose last-dir zsh-autosuggestions zsh-syntax-highlighting) # Sources source "${HOME}/.oh-my-zsh/oh-my-zsh.sh" source "$ZSH_CUSTOM/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" source "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"

Powerlevel10k (thème adaptatif)

# Thème Powerlevel10k (recommandé) if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" fi ZSH_THEME="powerlevel10k/powerlevel10k" # Reconfigurer au premier lancement : p10k configure

L’instant-prompt de Powerlevel10k affiche un prompt quasi-instantané (sans attendre le chargement du thème) en lisant le cache précédent. Le premier p10k configure génère le prompt via l’assistant interactif.

Variables globales ZSH

# Comportement par défaut bindkey -e # Mode Emacs (standard) setopt AUTO_CD # `..` change de dossier sans `cd` setopt AUTO_PUSHD # Chaque `cd` pousse le répertoire précédent setopt PUSHD_SILENT # Ne pas lister le stack des dossiers setopt HIST_IGNORE_DUPS # Ne pas dupliquer les entrées historiques setopt HIST_IGNORE_ALL_DUPS # Garder une seule instance par commande # Complétion zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' zstyle ':completion:*' menu select

zsh-autosuggestions

# Style par défaut (texte gris clair) export ZSH_AUTOSUGGEST_STYLE="fg=8" # Accepter avec la flèche droite OU TAB bindkey '^I' forward-char # TAB = forward

Git — .gitconfig

Configuration utilisateur

[user] name = Arthur Dupont email = arthur@example.com [init] defaultBranch = main [core] editor = vim autocrlf = input excludesfile = ~/.gitignore_global pager = diff-so-fancy | less --tabs=4 -RFX

Aliases Git

[alias] s = status -sb d = diff --color=always co = checkout br = branch -vv lg = log --oneline --graph --color=always --decorate pl = pull --rebase st = stash list sp = stash pop hist = log --pretty=format:\"%h %s\" --graph amend = commit --amend --no-edit undo = reset HEAD~1 --mixed

Credentials et SSL

[credential] helper = store --file ~/.git-credentials [http] postBuffer = 524288000 sslVerify = true [fetch] prune = true [pull] rebase = true

credential.helper = store enregistre les mots de passe en clair dans un fichier texte. En production, préférer store --file=/dev/shm/git-credentials (RAM, effacé au reboot) ou manager-core / osxkeychain selon l’OS. Ne jamais pousser ce fichier dans un dépôt.

Hooks Git courants

# Pré-commit : linter JS/TS et formatage cat > ~/.gitconfig.d/hooks/pre-commit << 'HOOKEOF' #!/bin/sh # Vérifier la présence de dist/ (build non commité) if git diff --cached --name-only | grep -qE '(dist|build)/'; then echo "Erreur : les fichiers compilés (dist/build) ne doivent pas être commités." exit 1 fi echo "Hook pre-commit : OK" HOOKEOF chmod +x ~/.gitconfig.d/hooks/pre-commit

.gitignore global

Fichier partagé entre tous les dépôts (lié via core.excludesfile dans .gitconfig) :

# OS .DS_Store .DS_Store? ._* .Spotlight-V100 .Trashes ehthumbs.db Thumbs.db # Éditeurs .idea/ .vscode/ *.swp *.swo *~ # Systèmes de version /.mvn/ mvnw mvnw.cmd /package-lock.json /yarn.lock composer.lock # Logs *.log logs/ # Environnements .env.local .env.*.local # Build dist/ build/ *.o *.pyc __pycache__/ # IDE / OS multiplexé .project .classpath *.iml

Pièges fréquents

  • .bash_profile vs .bashrc : .bash_profile est chargé pour les shells login (connexion SSH, terminal ouvert), .bashrc pour les shells non-login (terminaux ouverts dans un IDE, sous-processus). Pour un shell standard : charger .bashrc depuis .bash_profile (voir l’exemple ci-dessus).

  • ~/.profile ignoré par Bash : Bash ne lit pas .profile. C’est ZSH qui le lit par défaut (avec .zshenv et .zprofile). Éviter de mettre des config Bash dans .profile si l’utilisateur utilise Bash en login.

  • CRLF dans .gitconfig : core.autocrlf = input sur Linux est sans effet, mais sur Windows il convertit les CRLF en LF au commit. Vérifier que le fichier .gitconfig utilise bien le format attendu.

  • Liens symboliques brisés : si le dossier ~/.dotfiles est supprimé sans enlever les liens, les commandes standards (bash, git) ne fonctionneront plus correctement. Vérifier les liens avec ls -la ~ | grep "^l".

  • .zshrc chargé deux fois : Oh My Zsh et les plugins peuvent charger des fichiers qui sont aussi dans le path de complétion. Inspecter avec zsh -x -c exit 2>&1 | grep zshrc pour trouver les doublons.

  • Oublier de source : modifier .bashrc ou .zshrc sans recharger (nouveau terminal ou source ~/.bashrc) laisse la session en place périmée. exec bash est plus rapide qu’ouvrir un nouveau terminal.


Référence : bash manual , Zsh documentation , Git config reference . Tester chaque modification avec bash -n ~/.bashrc (pas d’erreurs de syntaxe) avant de recharger.