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.shInstaller 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
doneLe .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"
fiPrompt 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 configureL’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 selectzsh-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 = forwardGit — .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 -RFXAliases 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 --mixedCredentials et SSL
[credential]
helper = store --file ~/.git-credentials
[http]
postBuffer = 524288000
sslVerify = true
[fetch]
prune = true
[pull]
rebase = truecredential.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
*.imlPièges fréquents
-
.bash_profilevs.bashrc:.bash_profileest chargé pour les shells login (connexion SSH, terminal ouvert),.bashrcpour les shells non-login (terminaux ouverts dans un IDE, sous-processus). Pour un shell standard : charger.bashrcdepuis.bash_profile(voir l’exemple ci-dessus). -
~/.profileignoré par Bash : Bash ne lit pas.profile. C’est ZSH qui le lit par défaut (avec.zshenvet.zprofile). Éviter de mettre des config Bash dans.profilesi l’utilisateur utilise Bash en login. -
CRLF dans
.gitconfig:core.autocrlf = inputsur Linux est sans effet, mais sur Windows il convertit les CRLF en LF au commit. Vérifier que le fichier.gitconfigutilise bien le format attendu. -
Liens symboliques brisés : si le dossier
~/.dotfilesest supprimé sans enlever les liens, les commandes standards (bash, git) ne fonctionneront plus correctement. Vérifier les liens avecls -la ~ | grep "^l". -
.zshrcchargé deux fois : Oh My Zsh et les plugins peuvent charger des fichiers qui sont aussi dans lepathde complétion. Inspecter aveczsh -x -c exit 2>&1 | grep zshrcpour trouver les doublons. -
Oublier de
source: modifier.bashrcou.zshrcsans recharger (nouveau terminal ousource ~/.bashrc) laisse la session en place périmée.exec bashest 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.