degit : cloner un dépôt GitHub sans son historique git

Quand on veut démarrer un projet depuis un template GitHub, git clone pose un problème immédiat : il embarque tout l’historique du dépôt source. Vous héritez de centaines de commits qui ne vous appartiennent pas, avec une remote origin qui pointe vers le repo du créateur du template.

degit résout ça proprement.

Ce que fait degit

degit télécharge une snapshot du dépôt — uniquement les fichiers, sans le dossier .git. Le résultat est un répertoire propre, prêt pour git init, sans trace de l’historique d’origine.

npx degit user/repo mon-projet
cd mon-projet
git init
git add .
git commit -m "init"

Vous repartez de zéro, avec les fichiers du template, et votre propre historique git.

Installation

degit s’utilise directement sans installation via npx :

npx degit user/repo

Ou en installation globale si vous l’utilisez souvent :

npm install -g degit
degit user/repo

Syntaxe de base

# Depuis GitHub (par défaut)
npx degit user/repo

# Vers un dossier spécifique
npx degit user/repo mon-dossier

# Une branche précise
npx degit user/repo#ma-branche

# Un tag ou commit
npx degit user/repo#v2.0.0

# Un sous-dossier du dépôt
npx degit user/repo/packages/ui mon-ui

—force : écraser un dossier existant

Par défaut, degit refuse d’écrire dans un dossier non vide. L’option --force permet de passer outre et de superposer les fichiers du template sur un répertoire existant :

npx degit user/repo mon-projet --force

C’est utile pour changer de thème sur un projet existant : les fichiers du nouveau template viennent écraser les anciens, et seuls les fichiers absents du nouveau template restent en place.

GitHub, GitLab, Bitbucket, Sourcehut

degit supporte plusieurs forges en préfixant l’URL :

npx degit github:user/repo        # GitHub (défaut)
npx degit gitlab:user/repo        # GitLab
npx degit bitbucket:user/repo     # Bitbucket
npx degit git.sr.ht/~user/repo    # Sourcehut

Cas d’usage typiques

Bootstrapper un projet Astro depuis un thème :

npx degit michael-andreuzza/microblog mon-blog --force
cd mon-blog
npm install
npm run dev

Récupérer un seul package dans un monorepo :

npx degit facebook/react/packages/react-dom react-dom-src

Mettre à jour les fichiers de config d’un projet :

# Récupérer uniquement les fichiers de config CI d'un template
npx degit mon-org/ci-templates --force

Pourquoi pas git clone —depth 1 ?

git clone --depth 1 fait un clone superficiel — il limite l’historique à 1 commit, mais il reste un dépôt git à part entière avec une remote configurée. Vous devez ensuite supprimer la remote manuellement et réinitialiser le repo.

degit est plus direct : pas de .git, pas de remote, juste les fichiers. C’est exactement ce qu’on veut pour un template.

git clonegit clone --depth 1degit
Historique copiéComplet1 commitAucun
Dossier .git crééOuiOuiNon
Remote configuréeOuiOuiNon
VitesseLenteRapideRapide
Dossier non videErreurErreur--force

Limites

degit télécharge via l’archive tar de GitHub (pas via git). Cela signifie que les submodules git ne sont pas inclus. Si le repo source utilise des submodules, il faudra les récupérer séparément.

Les fichiers ignorés par .gitignore ne sont pas présents dans l’archive — ce qui est généralement le comportement attendu (pas de node_modules, pas de .env).

En résumé

degit est un outil d’une seule idée, exécutée parfaitement : copier les fichiers d’un dépôt sans son historique. Pour bootstrapper des projets depuis des templates, c’est l’outil le plus simple et le plus propre disponible.


Voir aussi :

  • lazygit — gérer git en TUI dans le terminal
  • git worktree — travailler sur plusieurs branches en parallèle